在beanstalk工作机上处理延迟和定期任务的服务

django-beanstalk-worker的Python项目详细描述


django豆茎工

在beanstalk工作机上处理延迟和定期任务的应用程序

概述

这个应用程序的核心是任务装饰器。在

当调用修饰任务函数而不是立即运行时,SQS消息将排队。当由工作线程取消排队时,该消息将导致调用原始函数。在

参数可以是JSON可序列化类型、日期时间和小数的任意组合,包括关键字参数。任何其他参数类型都将导致错误。在

SQS消息的队列在事务中发生在提交时,因此,如果事务发生异常,则该事务中调用的任何任务都不会运行。在

任务函数也可以根据需要由cron或管理命令调用。在

安装和设置

1: 已安装的应用程序

beanstalk_worker添加到installed_apps。在

2: 环境变量

在工作环境的Beanstalk配置的Software部分中,添加环境变量WORKER,并将其设置为1

3: Django设置

将以下设置添加到Django设置中:

BEANSTALK_WORKER=bool(os.environ.get("WORKER",False))BEANSTALK_TASK_SERVICE="beanstalk_worker.services.TaskService"BEANSTALK_SQS_URL=<SQSqueueURL>BEANSTALK_SQS_REGION=<Amazonregion>

您可以在Beanstalk环境配置的Worker部分找到SQS队列URL。在

对于测试和开发,您可以省略SQS设置,并且应该设置BEANSTALK_TASK_SERVICE = "beanstalk_worker.services.FakeTaskService"

4: 网址

在你的顶级网址的添加

^{pr2}$

这将添加url /tasks/task//tasks/cron。如果你这样做的话,你可以移动这些URL的基部,这个页面上的其他说明需要适当地更新。在

不要在生产web服务器中包含这些URL,只包括worker。在

对于测试和开发,您不会有单独的web和worker机器,所以总是包含URL的

5: Beanstalk Worker配置

在工作环境的Beanstalk配置的Worker部分中,将HTTP path设置为/tasks/task/,并将{}设置为application/json

使用

声明任务函数

frombeanstalk_workerimporttask@taskdefmy_task(message="hi"):print(message)

从代码中的任何位置调用该任务

my_task("hello world")

这将对一个SQS消息进行排队,指示工作线程运行实际函数。在

参数可以是JSON可序列化类型、日期时间和小数的任意组合,包括关键字参数

从CRON调用任务

cron.yaml中添加

-name:"my_project.my_app.tasks.my_task"url:"/tasks/cron/"schedule:"00***"

my_project.my_app.tasks.my_task应替换为任务函数的完全限定名。在

cron当前不支持参数。在

从命令行调用任务

./manage.py run_task my_project.my_app.tasks task "['hello world']"

my_project.my_app.tasks my_task应替换为任务函数的完全限定名,还应注意模块名和函数名之间的空格。在

开发、测试和FakeTaskServer

FakeTaskServer将对任务进行内部排队,但除非得到指示,否则不会运行它们。在

在设置.调试

当在Django设置中设置DEBUG = True时,/tasks/run_all/会显示一个额外的URL如果您插入这个URL,FakeTaskService将运行所有排队的任务。这对当地的发展很方便。在

测试支持

在测试中,您可以使用from beanstalk_worker import task_service获取正在运行的任务服务实例。这个类有两个助手clear,它们将丢弃所有排队的任务,run_all它将立即运行所有排队的任务。在

在settings.BEANSTALK_工作线程

运行任务时,FakeTaskServer将把settings.BEANSTALK_WORKER修补到True。这允许您assert settings.BEANSTALK_WORKER编写只应在工作线程上运行的代码。在

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

推荐PyPI第三方库


热门话题
hbm中的java异常。xml   java如何扩展JavaDoc5.0标准doclet?   java将所有非字母数字更改为+   java如何使用JSP从URL获取参数   把java学校的程序员变成C或C++程序员有多难?   java使用HTML获取表内容   java在JPanel中使用repaint()方法而不删除已绘制的内容   rest如何在Java中动态映射同一父类的子对象列表   如果协议不是http或https,java如何解析URL?   java删除文本时如何在eclipse中隐藏建议框?   java代码名1 GPS跟踪器   java寻找骑士所有独特的可能动作   从一个管道到另一个进程的java InputStream仍然被阻塞   java在阶段后将子项添加到窗格。show()   java如何确保在子对象中调用超级方法?   java从json对象获取值   java使用多线程读取文件   java Struts 1.1+Hibernate 3.2集成