我目前正在测试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个解决方案:
使用run_extraction信号检测状态变化并采取相应措施。 https://docs.djangoproject.com/en/1.8/topics/signals/
使用postgres通知触发器http://www.postgresql.org/docs/9.0/static/sql-notify.html
将chron设置为每分钟运行一次,将force_start或force_stop的所有对象设置为True,然后相应地执行操作。
注意:2& 3是关于django irc频道的Y3K想法。
最佳!
答案 0 :(得分:2)
嗯,听起来你真的想要反应性。 PGSQL有一些" NOTIFY"特色IIRC?也许看一看。
嗯,或者如果你不介意的话,设置一个每隔N分钟运行一次的chron并使用force_start或force_stop为True获取X对象然后调用你需要的东西。不知道这个选项的性能如何。
来自IRC上的#django:)