在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第三方库


热门话题
apache HttpClient execute(HttpUriRequest请求)和execute(HttpHost目标,HttpRequest请求)之间的java差异   如何向java进程传递多个密码   java servlet从外部事件调用网页中的javascript弹出/模式对话框   正在重置Unix Java路径变量   java将@Named managed bean注入另一个重用JSF页面?   java Cookie未显示在请求中   java如何记录用户的操作并在用户返回时重播?   java FTPSClient抛出异常javax。网ssl。SSLHandshakeException:握手期间远程主机关闭连接   java“变量可能尚未初始化”在何处使用开关盒进行初始化?   初始化Double java数组   java Android:如何通过按钮启动活动?   java设置外观和感觉颜色   计算两个时间戳对象之间的时间差的日期   扩展画布的类时,绘制方法出现java错误   java在不同的线程中运行JNI方法   java Spring引导OIDC刷新令牌场景   Java slf4j实现:logback vs log4j   java KeyEvents新的KeyEvent变量?   为什么java的模式和匹配器类中没有公共构造函数?   java在JVM上禁用本地JMX连接