在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
编写只应在工作线程上运行的代码。在
- 项目
标签: