Django Chroniker:如何在运行时停止自定义命令

时间:2015-08-27 15:10:37

标签: python django cron celery

我目前正在测试Django chroniker的长期任务。

是的,我也测试了Celery很长一段时间,但是我想尝试使用django-chroniker,因为它集成了更多开箱即用的管理功能来启动&停。

我面临的问题是,虽然“运行”确实有效,但是django中的停止按钮只显示一条好消息,但似乎并没有真正停止我的过程。

所以我创建了一个非常简单的自定义命令:

import time
import logging
import logging.config

from django.core.management.base import BaseCommand, CommandError

from longrunningfunction import run_extraction

class Command(BaseCommand):
  help = 'Closes the specified poll for voting'
  logging.config.fileConfig('logging.conf')

  def handle(self, *args, **options):
    logger = logging.getLogger('top')
    logger.debug('Launching test_cmd %s %s', args, options)
    run_extraction()

现在命令已启动,我点击了admin中的stop。 那么,我需要做什么才能在我的代码中考虑到这一点?如何中断run_extraction的执行?

我还在源代码中看到作业“force_stop”字段设置为True。所以我需要传递对该字段的引用并定期检查它?

- 编辑28/08/2015 在IRC上暴露问题后,我现在正在考虑以下3个解决方案:

  1. 使用run_extraction信号检测状态变化并采取相应措施。 https://docs.djangoproject.com/en/1.8/topics/signals/

  2. 使用postgres通知触发器http://www.postgresql.org/docs/9.0/static/sql-notify.html

  3. 将chron设置为每分钟运行一次,将force_start或force_stop的所有对象设置为True,然后相应地执行操作。

  4. 注意:2& 3是关于django irc频道的Y3K想法。

    最佳!

1 个答案:

答案 0 :(得分:2)

  

嗯,听起来你真的想要反应性。 PGSQL有一些" NOTIFY"特色IIRC?也许看一看。

     

嗯,或者如果你不介意的话,设置一个每隔N分钟运行一次的chron并使用force_start或force_stop为True获取X对象然后调用你需要的东西。不知道这个选项的性能如何。

来自IRC上的#django:)