一个简单的应用程序,它提供了一个使用Socket作为代理的消息队列系统,这个应用程序使您能够管理一个有序的任务队列(调用一个简单的队列函数API)。您可以使用多个应用程序ISTrand,并轻松地管理多个代理和亲属队列。这个应用程序将集成到您的数据库后端,并使用队列的状态服务三个表。

django-queue-manager的Python项目详细描述



django队列管理器(dqm)



**一个简单的异步任务队列,通过django应用程序和socketserver,0
配置。**

-[为什么?](为什么)

-[概述](概述)

-[安装](安装)

-[设置](设置)

-[运行任务队列服务器](运行任务队列服务器)

-[持久性](持久性)

-[在另一个任务队列上运行任务队列服务器](在另一台服务器上运行任务队列)



虽然芹菜几乎是django任务队列的标准解决方案,但安装和配置起来可能很复杂。

web应用程序队列的常见情况是发送电子邮件:您不希望django线程等到smtp或电子邮件提供程序api,
饰面。但是,要从没有大量流量的站点发送电子邮件,或者运行其他类似的简单任务,您不需要芹菜。

更复杂的分布式队列可以等到网站有大量的流量,并且确实需要可伸缩性。

a name="overview">;<;/a>;概述:



总之,python socketserver在后台运行,并监听tcp socket。socketserver从其
套接字获取运行任务的请求,并将任务放入队列。工作线程从这个
队列中挑选任务,并逐个运行这些任务。

socketserver istance可以是一个或多个,根据您的应用程序要求。

**kwargs)


发送电子邮件可能看起来像:

push_task_to_queue(send_mail,subject="foo",message="baz",recipient_list=[user.email])

如下所示:

specific_queue=dqmqueue.objects.get(description='foo_queue')
push_task_to_queue(send_mail,subject="foo",message="baz",recipient_list=[user.email],dqmqueue=specific_queue)

监听TCP套接字的Python SocketServer。
2.工作线程。
3.python队列:运行异步任务的工作流:1。当"socketserver"启动时,它会初始化"worker"线程。
2。`` socketserver``监听请求。
3.当"socketserver"接收到一个请求(带有args和kwargs的可调用函数)时,它会将请求放到python的"queue"上。
4。"worker"线程从"queue"中选择任务。
5。"worker"线程运行该任务。





绝对!:SocketServer很简单,但很可靠,而且随着
站点获得更多流量,可以将Django_Queue_Manager服务器移动到
另一台计算机、单独的数据库、使用SocketServer的多个距离等…
在某些情况下,可能最好选择芹菜。在此之前,django_queue嫒u manager是一个简单、可靠且不急于求成的解决方案。



\lt;a name="install">;<;/a>;安装:


>1。使用以下pip命令"pip3 install django_queue_manager"安装django_queue_manager。

2。在"已安装应用程序"列表中添加"django队列管理器"。

3.迁移:

$manange.py迁移

>4。django_queue_manager应用程序有一个api模块,带有一个"push_task_to_queue"函数。使用此函数可将带参数和Kwargs的可调用函数发送到队列,
您可以使用参数dqmqueue指定特定队列,如果未指定,则使用默认队列,对于异步运行。

具有以下参数:

**描述**队列的描述。

**队列\ u主机**运行socketserver的主机。默认值为
"localhost"。(它也可以是远程主机)

**队列端口**
socketserver监听的端口。默认值为
8002。

**最大重试次数**工作线程在跳过任务之前尝试运行
任务的次数。默认值是3。



因此,简而言之,对于使用多个队列,只需在管理页面中添加一个新队列
,然后在下面的函数中传递有效的"dqmqueue"对象的距离:




将"任务"推送到队列(send_mail,subject="foo",message="baz",recipient_list=[user.email],dqmqueue=specific_queue)


使用python>;=3
(如果使用virtualenv,请在supervisor conf.d文件中指定环境路径):




import os
os.environ.setdefault("django_settings_module","your-app-name.settings")
从django队列管理器导入django.setup()
导入时间
从django队列管理器导入worker队列管理器
从django队列管理器导入dqmqueue
从django队列管理器导入服务器管理器导入tasksocketserverthread
worker_manager.start()
server_thread=tasksocketserverthread('localhost',dqmqueue.objects.first().queue_port)
time.sleep(5)
socket_server=server_thread.socket_server()
socket_server.serve_forever()


*注意:必须使用应用程序的名称更改变量"your-app-name.settings",就像这样:"email-sender.settings")*



\
基本语法非常简单




$python<;package install dir>;/shell.py queue host queue port命令

"worker off")

这将向工作线程发送停止事件。检查工作线程是否已停止:





$python django_queue_manager/shell.py localhost 8002 ping
发送:ping
接收:(false,"worker off")


现在您可以安全地停止socketserver:



12345 pts/1 s 7:20<;进程名>;
$sudo kill 12345

"我很好")

115)


115个任务正在等待队列

从线程
启动时起到队列中

*注意:如果经常使用tasks server命令,请为这些命令添加shell别名*




你已经有数据库了!*

**queuedtasks**模型保存推送到队列中但尚未处理的所有任务。
该任务被pickle为"django"queue manager.task"manager.task"对象,它是一个带有"callable"、"args"、"dqmqueue"和"kwargs"属性的简单类,
还有一个方法:``run()``。

*成功执行后,队列任务将被删除并移到"successtask"队列中。*

*注意:如果在django管理下拉操作中使用requeue task函数,
选定的任务将像"queuedtasks"表中的新任务(使用新的"task"id``)一样重新排队。*

**successtasks**工作线程将成功执行的作业保存到该模型中
包含上述所有信息:

``task\u function``:完整的函数名称类似"module.function\u name"

`` task\u args``:纯文本中的变量列表参数

`` task\u kwargs``:纯文本中的字典参数

`` task\u id``:从初始队列任务距离携带的任务id

`` success\u on``:成功datetime

`` pickled_task``:完成的pickled task

``dqmqueue``:在工作进程根据``max撸retries```(在使用的dqmqueue中指定)多次尝试运行任务之后,dqmqueue queue istance的引用

**失败的tasks**,任务仍然失败,worker将其保存到这个模型中,其中包含上面的所有信息:

``task廑function廑name``:完整的函数名,如"module.function廑name"

``task廑args``:纯文本中的变量列表参数

``task廑args``:纯文本中的字典参数文本

``任务id``:从初始队列任务距离

``在``上失败``携带的任务id:上次失败的运行日期时间

``异常``:异常消息,只保存上次运行的异常。

``pickled_task`:完整的pickled task

``dqmqueue``:dqmqueue queue istance的引用

*注意:如果在django admin下拉操作中使用requeue task函数,
选定的任务将像"queuedtasks"表中的新任务一样重新排序(使用新的"task"id`)。

删除失败/成功的任务。您可以运行cron脚本或
其他脚本来清除任务。

在**任务运行之前,您可以对工作类进行子类化(…或直接编辑),并为此连接**添加ping或其他检查。如果连接不可用,请尝试重新连接。


在另一台服务器上运行任务队列:
----------

队列服务器应该类似于主django服务器,只是
没有web服务器。
2。将django代码部署到这两个远程:带有
web服务器的main和队列服务器
3。打开主django服务器与队列
服务器之间以及主django数据库与队列服务器主机
4之间的防火墙端口。在django主服务器上,直接从管理站点更改主机和端口的详细信息。

就这样!
如需任何支持/发布请求,请联系作者:fardella.simone@gmail.com



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

推荐PyPI第三方库


热门话题
如何使用java创建灰度图像   java Android VideoView在长时间运行(超过24小时)后冻结   javaxml到XSL格式   servlets如何在Java中获取POST变量值   java给加入indtantly jda的用户jda一个角色的最佳方式是什么   java在读取带有列表的文件时获取所有空值   java在无管理员权限的NetBeans中使用JavaFX场景生成器2.0   java如何通过JSON API实现复杂的条件批量部分更新?   java使用ApacheLucene索引大文件时,如何避免内存不足错误?   使用协议“mapi://”从java对outlook中打开的邮件进行编码   java trywithresources详细信息   java在对JTable进行排序后无法从中获取正确的行(Swing)   单元测试如何在测试类(java)中的main中存根函数   oauth 0auth_签名在java中使用SHA1RSA   java重写equals和hashCode只是为了调用super。等于/哈希代码还是抛出断言错误?