Django的简单任务队列和cronlike调度程序

django-toosimple-q的Python项目详细描述


Django队列太简单

PyPI versionWorkflow

这个包为Django提供了一个简单的任务队列和调度程序。在

如果任务的执行是任务关键型的,请不要使用此库,而是使用更复杂的解决方案,如Celery,因为此软件包既不能保证任务的执行,也不能保证执行的唯一性。在

它面向的是基本的应用程序,简单性高于可靠性。该包提供了简单的decorator语法,包括类似cron的调度。在

特点:

  • 没有芹菜/雷迪斯/拉比MQ/诸如此类。。。就Django!在
  • 干净的装饰器语法来注册任务和计划
  • 简单排队语法
  • 类cron调度
  • 在任务.py自动发现
  • django管理集成

限制:

  • 可能不是非常可靠,因为比赛条件
  • 还没有多线程(但是运行多个worker应该可以工作)

安装

安装库:

$ pip install django-toosimple-q

settings.py中启用应用程序:

^{pr2}$

快速启动

任务需要使用@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

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

推荐PyPI第三方库


热门话题
java系统。出来打印导致延迟?   java如何使用dasein API连接Azure云(blob存储)   java如何将Jframe cardlayout中的“card”从属于card的Jpanel更改为另一个类?   java如何在单个消息框中显示循环的所有迭代?   java如何设置netbeans保存项目的操作?   java网站的某些选项在web视图中不起作用   java如何在安卓中打开从右到左的菜单滑动条   java更容易反转由静态方法(函数接口)内联创建的比较器?   映射Java HashMap。获取(键)和树形图。获取equals和compareTo方法的(键)用法   java Health endpoints只显示“status:up”,不显示敏感信息   java当我一直按back按钮登录时,字段显示以前插入的用户数据   JTable单元中的java图像显示   go Java vs.Golang for HOTP(rfc4226)   java使用函数链减少分支和清理代码,这有意义吗   java我应该为每个查询创建一个新的DB连接吗?   java推荐的函数调用方法(是否使用CompiledScript?)   java截断分区和地板分区有什么区别?   没有spring引导的java Profile特定属性文件?   异常如何在java中从控制台读取密码?