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

django-gearman-jbox的Python项目详细描述


django gearman jbox
===

*django gearman jbox*是[gearman][gearman]
[python bindings][python gearman]的方便包装器。


django gearman jbox可以为django项目中的工作人员和客户编写代码
应用。服务器连接等都位于django gearman jbox中,不要不必要地阻塞您的应用程序代码。

ator way'创建workers(非常酷)
-[django gearman commands][django gearman commands]用于'gearman_server_info'命令(非常好)


,但有一些修改:

workers现在是单独启动的,因此必须传递2个强制参数才能开始工作er:
-worker s所在的django应用程序名带有"-a"参数
-worker的名带有"-n"参数

参数"-q"仍在此处,并且具有与[django gearman]中相同的功能。

-我删除了同时启动多个woker的功能([django-g中的"-w"参数earman.)。
我更喜欢每个工人有一个流程,并监督管理流程。(屏幕不是一个选项)
-我还添加了一个信号处理程序,用于在工作程序连接到控制台时捕获由supervisord和sigint发送的sigterm信号。
这使您能够在工作程序终止之前执行代码。
(请参见"django_gearman_jbox\management\commands\ gearman_worker.py`,第116行)

[gearman]:http://gearman.org
[python gearman]:http://github.com/samuel/python gearman
[django gearman]:https://github.com/fwenzel/django gearman
[django gearman commands]:https://github.com/codescaleinc/django gearman commands


安装
----
对于django项目的客户端和工作实例都是一样的:

$pip install django gearman jbox

设置.py文件:


您喜欢的工人,每个文件一个工人。创建一个空的`u init_uuu.py`以便将目录作为一个包加载。





>示例:



>我的大江哥应用
br/>注册tasks
在worker文件中,可以根据需要定义任意多个任务。
函数必须接受调用方传递的单个参数,并且必须返回操作结果(如果适用)。(注意:它必须接受一个参数,即使您不使用它)。


###任务命名
由于可读性的原因,为任务指定了其导入路径的默认名称,并去掉了短语
"gearman_task"。通过指定decorator的"name"参数,可以覆盖
任务名。方法如下:

import django_gearman_jbox.decorators.gearman_task

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

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

@gearman_task(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_task(name='my-task-name')
def my_task_function(one,two,three):
pass


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

em via
关键字名称或一个特殊的"args"关键字,而不是键入类似七个"none"的内容:

client.submit嫒job('my-task-name',none,none,none,none,none,none,none,none,1,2,3)


gearman 2.0.2开始,这些是:

*数据
*唯一
*优先级
*后台
*等到完成
*最大重试次数
*轮询超时

参数,您需要以特殊的、更详细的方式执行任务。下面是这样一个任务及其执行的示例:

@gearman_task(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_Worker-a<;django_app_name>;-n<;worker_name>;`。它将开始
为该工人提供所有注册的任务。

示例:

$python manage.py gearman_worker-a django_app_name-n worker_bar

若要生成多个工人,请参阅supervisord config下面的持续时间。

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

首先要做的是将队列名称传递到作业描述中,例如
这:

@gearman_task(name="task_foo",queue="foo"
def function_foo(some_arg):
通过

@gearman_task(name="task_bar",queue="bar")
def function_bar(some_arg):
pass

@gearman_task(name="task_babar",queue="bar")
def function_babar(some_arg):
pass


然后可以继续启动绑定到特定队列的任务:


python manage.py gearman_worker-a<;django_app_name>;-n<;worker_name>;-q bar


请注意,如果不指定队列名称,worker
将加载所有任务。

###使用supervisord启动工人
supervisor-http://supervisord.org/是流程的保姆。
它允许您启动、重新启动和监视正在运行的流程。在我们的例子中,将是workers。
要这样做,请按worker创建一个配置文件,并使用"numprocs"参数调整所需的worker数量:

`worker-foo.conf`:

[program:worker-foo]
command=/path to your virtualenv/bin/python/path to your project/manage.py gearman_worker-a<;django_app_name>;-n%(程序名)s
process_name=%(程序名)s_%(进程名)02d
numprocs=1
autostart=true
autorestart=true
user=myapp
directory=/home/myapp/
environment=home='/home/myapp',user='myapp',logname='myapp',

`worker_bar.conf`:


[program:worker_bar]
command=/path to your virtualenv/bin/python/path to your project/manage.py gearman_worker-a<;django_app_name>;-n%(program_name)s-q bar
进程名=%(程序名)s%(进程号)02d
numprocs=2
autostart=true
autorestart=true
user=myapp
directory=/home/myapp/
environment=home='/home/myapp',user='myapp',logname='myapp',

您还可以创建包含以下内容的"groups.conf"文件:

[group:foo]
programs=worker_foo,worker_foo2

[group:bar]
programs=worker_bar,worker_bar2


重新部署新代码时立即分组。

supervisortl重新启动栏:*

ee`django_gearman_jbox\management\commands\gearman_worker.py`,第116行


请注意,这将影响所有工人,因为它位于对所有工人都是全局的"gearman_worker.py"脚本中。



clients
----
要使工人工作,您需要一个通过da的客户端应用程序向他们发送数据。
创建并实例"django_gearman_jbox.gearman client"类,并用它执行submit_作业:

from django_gearman_jbox import gearmanclient

sentence="快速的棕色狐狸跳过懒惰的狗。"

client=gearmanclient()
res=客户端.提交作业("foo",kwargs={"sentence":句子})
打印"结果:'%s'%res

不等待结果就发送后台事件也很容易:

client.提交作业("foo",background=true,kwargs={"sentence":句子})

gearman服务器信息
————

`python manage.py gearman_server_info`输出gearman服务器的当前状态。
如果安装了prettytytytable依赖项,则输出如下:

$python manage.py gearman_server_info
+————+——————+————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————+————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————| 1 1 0
d任务客户端ID文件描述符
+——+——+——+——+——+————+————+————+—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————|-| 37
+—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————--——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————-----+—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————|1 0 0
+——+——+——+——+——+——+——+————+————+——————————+———————————————————————————————————————————————————————————————————————————————————————————————--+—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————许可证块*****
版本:mpl 1.1/gpl 2.0/lgpl 2.1


此文件的内容以Mozilla公共许可证版本
1.1("许可证")为准;除非符合许可证,否则您不能使用此文件。您可以在
http://www.mozilla.org/mpl/


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

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


原始代码是Django Gearman。


原始代码的初始开发人员是Mozilla。
初始开发人员创建的部分是版权所有(C)2010
初始显影剂。保留所有权利。

contributor(s):
frederic wenzel<;fwenzel@mozilla.com>;
jeff balogh<;me@jeffbalogh.org>;
jonas<;jvp@jonasundderwolf.de>;
jozef shiev_k<;sevick@codescale.net>;
nicolas rodriguez<;nrodriguez@jbox web.com>;

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

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

推荐PyPI第三方库


热门话题
java Android使用两个后台服务错误   解压缩HTTPInputStream时,java GZIPInputStream过早关闭   javax和javax的区别是什么。网ssl。密钥库和服务器。ssl。为SpringBoot应用程序指定密钥库时的密钥库属性   java生成两个JPanel,而我只需要一个   java深度链接从play store安装应用程序时获取数据   java 安卓应用程序在退出时未正确释放蓝牙   java正确使用setCellValueFactory   java开放JdbcTemplate连接处于只读模式?   使用Spring MVC创建服务时发生java错误   JavaFX获取安装在计算机中的特定应用程序的版本   SecureRandom的安全问题:PRNG在java 1.5中不一致   windows我可以创建一个独立的。带Inno设置的Java应用程序的exe安装程序?   如何使用JavaServlet下载csv文件?   java从生成的缓冲图像中添加图像作为jasper中的数据记录?   java日期和时间解析