Django的简单任务队列和cronlike调度程序
django-toosimple-q的Python项目详细描述
Django队列太简单
这个包为Django提供了一个简单的任务队列和调度程序。在
如果任务的执行是任务关键型的,请不要使用此库,而是使用更复杂的解决方案,如Celery,因为此软件包既不能保证任务的执行,也不能保证执行的唯一性。在
它面向的是基本的应用程序,简单性高于可靠性。该包提供了简单的decorator语法,包括类似cron的调度。在
特点:
- 没有芹菜/雷迪斯/拉比MQ/诸如此类。。。就Django!在
- 干净的装饰器语法来注册任务和计划
- 简单排队语法
- 类cron调度
- 在任务.py自动发现
- django管理集成
限制:
- 可能不是非常可靠,因为比赛条件
- 还没有多线程(但是运行多个worker应该可以工作)
安装
安装库:
$ pip install django-toosimple-q
在settings.py
中启用应用程序:
快速启动
任务需要使用@register_task()
修饰符注册。一旦注册,就可以通过调用.queue()
函数将它们添加到队列中。在
fromdjango_toosimple_q.decoratorsimportregister_task# Register a task@register_task()defmy_task(name):returnf"Hello {name} !"# Enqueue tasksmy_task.queue("John")my_task.queue("Peter")
可以使用以下类似cron的语法从代码调度已注册的任务:
fromdjango_toosimple_q.decoratorsimportregister_task,schedule# Register and schedule tasks@schedule(cron="30 8 * * *",args=['John'])@register_task()defmorning_routine(name):returnf"Good morning {name} !"
要使用这些任务,您至少需要运行一个worker:
$ python manage.py worker
工作人员将在需要时将计划任务添加到队列中,并执行这些任务。在
程序包从所有已安装的应用程序自动加载tasks.py
。虽然这是定义任务的推荐位置,但您可以从代码中的任何位置执行此操作。在
高级用法
任务
您可以选择为任务指定自定义名称。在本地范围中定义任务时,这是必需的。在
@register_task("my_favourite_task")defmy_task(name):returnf"Good morning {name} !"
您可以设置任务优先级。在
@register_task(priority=0)defmy_favourite_task(name):returnf"Good bye {name} !"@register_task(priority=1)defmy_other_task(name):returnf"Hello {name} !"# Enqueue tasksmy_other_task.queue("John")my_favourite_task.queue("Peter")# will be executed before the other one
如果任务已经用相同的参数排队,则可以将任务标记为unique=True
。这对于诸如清洁或刷新之类的任务非常有用。在
@register_task(unique=True)defcleanup():...cleanup.queue()cleanup.queue()# this will be ignored as long as the first one is still queued
您可以将任务分配给特定队列,然后让您的工作人员仅使用--queue myqueue
或--exclude_queue myqueue
从特定队列中使用任务。默认情况下,工人使用所有任务。在
@register_task(queue='long_running')deflong_task():...@register_task()defshort_task():...# Then run those with these workers, so that long# running tasks don't prevent short running tasks# from being run :# manage.py worker --exclude_queue long_running# manage.py worker
时间表
默认情况下,last_run
在计划创建时设置为now()
。这意味着它们只在下一次cron发生时运行。如果需要在初始化后尽快运行计划,可以指定last_run=None
。在
@schedule(cron="30 8 * * *",last_run=None)@register_task()defmy_task(name):returnf"Good morning {name} !"
默认情况下,如果某些cron丢失了(例如,在服务器关闭之后或者如果worker无法跟上所有任务),则丢失的任务将丢失。如果需要任务来赶上,请设置catch_up=True
。在
@schedule(cron="30 8 * * *",catch_up=True)@register_task()defmy_task(name):...
您可以为同一任务定义多个计划。在这种情况下,必须指定一个唯一的名称:
@schedule(name="morning_routine",cron="30 16 * * *",args=['morning'])@schedule(name="afternoon_routine",cron="30 8 * * *",args=['afternoon'])@register_task()defmy_task(time):returnf"Good {time} John !"
开发
测试
$ python manage.py test
- 项目
标签: