代码之家  ›  专栏  ›  技术社区  ›  Arbazz Hussain

如何完成芹菜中的停止任务?

  •  1
  • Arbazz Hussain  · 技术社区  · 8 年前

    撤消@periodic\u task sends上的任务 Discarding revoked tasks & Due task to workers.

    celery-workers-screenshot

    [2018-09-17 12:23:50,864: INFO/MainProcess] Received task: cimexapp.tasks.add[xxxxxxx]
    [2018-09-17 12:23:50,864: INFO/MainProcess] Discarding revoked task: cimexapp.tasks.add[xxxxxxx] [2018-09-17 12:24:00,865: INFO/Beat] Scheduler: Sending due task cimexapp.tasks.add (cimexapp.tasks.add) [2018-09-17 12:24:00,869: INFO/MainProcess] Received task: cimexapp.tasks.add[xxxxxxx]
    [2018-09-17 12:24:00,869: INFO/MainProcess] Discarding revoked task: cimexapp.tasks.add[xxxxxxx] [2018-09-17 12:24:10,865: INFO/Beat] Scheduler: Sending due task cimexapp.tasks.add (cimexapp.tasks.add) [2018-09-17 12:24:10,868: INFO/MainProcess] Received task: cimexapp.tasks.add[xxxxxxx]
    [2018-09-17 12:24:10,869: INFO/MainProcess] Discarding revoked task: cimexapp.tasks.add[xxxxxxx]


    tasks.py

    @periodic_task(run_every=timedelta(seconds=10),options={"task_id":"xxxxxxx"})
    def add():
         call(["ping","-c10","google.com"])
    
    
    def stop():
        x = revoke("xxxxxxx",terminate=True,signal="KILL")
        print(x)
        print('DONE')
    

    我创造了 task_id

    如何完全阻止它发送任务? 我不想把所有的工人都杀了

    • 芹菜-一个PROJECTNAME控件关闭

    • 我只想停止工作 add() 功能。
    1 回复  |  直到 8 年前
        1
  •  2
  •   a_k_v    7 年前

    一种可能的方法是将任务存储在数据库中并动态添加或删除任务。您可以使用数据库支持的芹菜节拍调度程序进行相同的操作。参考 https://django-celery-beat.readthedocs.io/en/latest/ . PeriodicTask数据库存储定期任务。您可以使用数据库命令(Django ORM)来操作周期性任务。

    这就是我处理动态任务(动态创建和停止任务)的方式。

    from django_celery_beat.models import PeriodicTask, IntervalSchedule, CrontabSchedule
    
    chon_schedule = CrontabSchedule.objects.create(minute='40', hour='08', day_of_week='*', day_of_month='*', month_of_year='*') # To create a cron schedule. 
    schedule = IntervalSchedule.objects.create(every=10, period=IntervalSchedule.SECONDS) # To create a schedule to run everu 10 min.
    PeriodicTask.objects.create(crontab=chon_schedule, name='name_to_identify_task',task='name_of_task') # It creates a entry in the database describing that periodic task (With cron schedule).
    task = PeriodicTask.objects.create(interval=schedule, name='run for every 10 min', task='for_each_ten_min', ) # It creates a periodic task with interval schedule
    

    每当您更新周期时,也会请求此表中的计数器 递增,这告诉芹菜跳动服务重新加载

    所以你不需要重新开始或停止跳动。

    periodic_task = PeriodicTask.objects.get(name='run for every 10 min')
    periodic_task.enabled = False
    periodic_task.save()
    

    如果enabled为False,则周期性任务将变为空闲。您可以通过使 enable = True

    创建项目模型对象时,也要创建周期性任务。只需根据您的场景创建cron计划或间隔计划。然后创建 PeriodicTask Project.name 到 名称(以便您可以轻松地将项目对象与 对象。就这样,从那一刻起,任务就由芹菜打理了。

    如果要动态禁用或启用周期性任务,只需在 周期任务 如下

        task = PeriodicTask.objects.get(name='task_name')
        task.enabled = False
        task.save()
    
        2
  •  1
  •   Kyamasam    6 年前

    在Celery4.2.2中,您可以通过执行以下命令删除所有beat任务

    celery -A YourProjectName purge
    

    记住替换项目名。 有关更多信息,请查看此 page