django/python中gearman客户机和工作者的方便包装器

django-gearman的Python项目详细描述


django gearman是[gearman][gearman]


*django gearman*的方便包装器。


服务器连接等都位于django gearman中,不要不必要地阻塞应用程序代码。

[gearman]:http://gearman.org
[python gearman]:http://github.com/samuel/python gearman

django项目的工作实例:

pip install-e git://github.com/fwenzel/django gearman.git egg=django gearman

#一个或多个gearman服务器
gearman_servers=['127.0.0.1']


workers
----
作业必须接受调用方传递的单个参数
,并且必须返回操作结果(如果
适用)。(注意:它必须接受一个参数,即使您不使用它)。


查看"gearman_example"应用程序的"gearman_job s.py"文件。


通过指定decorator的"name"参数,可以覆盖
任务名。方法如下:

@gearman_job(name='my-task-name')
def my_task_function(foo):
pass

\gearman内部作业命名:``gearman_job_name``
gearman任务的内部版本
名称。这允许您将应用程序中易于使用的名称映射到Gearman中更复杂、唯一的名称。


此方法的默认行为如下:

可以在同一台服务器上运行。如果在共享gearman服务器上运行同一应用程序的多个独立实例,则可能需要对其进行更改。

只需在"settings.py"中定义
``gearman_job_name``函数:


gearman_job_name=lambda name:name


参数
(通常称为"data"参数)。此外,该参数
只能是字符串。有时这可能还不够。如果希望
传递数组或dict,该怎么办?您需要序列化和反序列化它们。
幸运的是,django gearman可以处理这个问题,这样你就可以把所有的时间都花在编码实际任务上了。

@gearman_job(name='my-task-name')
def my_task_function(foo):
pass


client.submit_job('my-task-name',{'foo':'becomes','this':'dict'})
client.submit job('my-task-name',decimal(1.0))


\下面是一个作业定义示例:

@gearman_job(name='my-task-name')
def my_task_function(one,two,three):
pass


_作业('my-task-name',args=[1,2,3])

因为gearman的python绑定中的submit-job包含了很多参数,通过关键字名或特殊的args关键字来指定它们要比输入7个类似的参数容易得多:client.submit-job('my-task-name',none,none,none,none,none,none,none,1,2,3)


您唯一的限制是gearman保留的关键字参数。截至
Gearman 2.0.2,这些是:

*数据
*唯一
*优先级
*背景
*等待_完成
*最大重试次数
*轮询超时

``唯一的关键字参数,您需要以特殊的、更详细的方式执行作业。下面是这样一个作业及其执行的示例。

@gearman_job(name='my-task-name')
def my_task_function(background,unique):
pass


client.submit_job('my-task-name',kwargs={"background":true,"unique":false})
client.submit_job('my-task-name',args=[true,false])


最后:


客户端提交作业('my-task-name',background=true,unique=true,kwargs={"background":false,"unique":false})


不要惊慌,您的任务是安全的!那是因为你直接使用了"kwargs"。因此,gearman的绑定将为
``submit`job``函数接收"true",而您的任务将接收"false"。


Gearman_工人。它将开始
为所有已注册的作业提供服务。

要生成多个工作线程(例如,如果您的大多数作业都是I/O绑定的),
使用`-w'选项:


将启动五个工作线程。

对于和执行作业,
您可能希望在屏幕会话或类似会话中运行此操作。


一个简单的描述它的方法是:假设您有一个从服务器获取电子邮件的任务,另一个发送电子邮件的任务,还有一个通过sms网关发送sms的任务。您可能会遇到的一个问题是,电子邮件获取任务可能会有效地"阻止"工作人员
(其中可能有很多任务,可能非常耗时,其他
任务都无法通过)。当然,一种解决方案是添加更多的worker(通过`-w``参数),但这只能暂时解决问题。这是队列进入的地方。

比如
这个:

@gearman_job(queue="my queue name")
def some_job(some_arg):
pass


事实上,当您不指定队列名称时,worker
将处理所有任务。

clients
----
要使您的worker工作,您需要一个客户端应用程序将数据传递给它们。创建
和"django戋u gearman.gearman client"类的实例,并用它执行
"django戋u gearman.task":


from django戋u gearman import gearmanclient,task
client=gearmanclient()
res=client.do戋task(task("gearman戋example.reverse",(句子))
打印"结果:'%s'%res

不必等待结果也很容易:

client.dispatch_background_task('gearman_example.background_counting',none)


`management/commands/gearman_example_client.py`文件中。


example app
----
对于完整的、工作的示例应用程序,请将"gearman_example"添加到
`installed_apps`中,然后在一个shell中运行一个worker:

python manage.py gearman_worker-w 4


并在另一个shell中执行示例应用程序:


它。

许可
——
此软件是在[Mozilla Tri-license][MPL]下许可的:

*****开始许可块*****
版本:mpl 1.1/gpl 2.0/lgpl 2.1


"许可证");除非符合
许可证,否则您不得使用此文件。您可以在
http://www.mozilla.org/mpl/


http://www.mozilla.org/mpl/

处获得许可证副本,根据许可证分发的软件是按"原样"分发的,
无任何形式的明示或暗示担保。有关
许可下的特定语言管理权利和限制,请参见许可证


原始代码是django gearman。

原始代码的初始开发人员是mozilla。
初始开发人员创建的部分是版权所有(c)2010年
最初的开发商。保留所有权利。

contributor(s):
frederic wenzel<;fwenzel@mozilla.com>;


GNU Lesser General Public License 2.1版或更高版本(简称"LGPL"),
在这种情况下,GPL或LGPL的规定适用于上述规定。如果您希望仅在GPL或LGPL的条款下使用您的版本,而不允许其他人在MPL的条款下使用您的版本,通过删除上述条款来表明您的
决定,并用通知
和GPL或LGPL要求的其他条款代替。如果您不删除上述规定,收件人可以在MPL、GPL或LGPL的任何一个条款下使用您的本文件版本。http://www.mozilla.org/mpl/

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
ArrayList中实体对象上的JAVA泛型   带Redis的爪哇芹菜vs单用Redis   java在设备面向横向时隐藏标题栏/通知栏   java JXTreeTable:如何使用ComponentProvider为一列设置渲染器   java创建异常的成本与记录异常的成本相比   java在方法参数中使用setter传递新对象   java在一个类中的方法与另一个类中的方法交互时遇到问题   java如何迭代2个大小相等的ArrayList   Java getDesktop()。open在Windows中工作,但在Mac中不工作   从tomcat切换到jetty后的java“无法启动嵌入式容器”,Spring引导   java如何使用void方法   java如何在解组时在JAXB的ValidationEventHandler中获取节点值?   如何使用Akka Java API创建不响应的TCP接收器   JavaScriptjQuery在java中将记录上传到数据库时的进度条   如何在重新绘制时在java小程序中显示上一个图像