在Celery中使用全局变量:最佳方法是什么?
问题描述:
我正在用Django 1.10和Celery编写应用程序。 我试图创建一个可以通过Django启动和停止的芹菜循环。在Celery中使用全局变量:最佳方法是什么?
我的想法看起来是这样的(很简单):
_run = False
def do_work():
global _run
while _run:
# Do something
@app.task
def start():
global _run
_run = True
do_work()
@app.task
def stop():
global _run
_run = False
的问题是,芹菜通常在> 1个工作线程运行,_run是不是线程之间accessable。
问题:实现该功能的最佳方法是什么? 我正在考虑设置一个数据库变量,但恐怕它不是最好的方法。
答
其中一种可能的方法是创建将永久运行然后根据请求停止的任务。
from proj.celery import app
app.control.revoke(task_id)
http://docs.celeryproject.org/en/latest/faq.html#can-i-cancel-the-execution-of-a-task
这似乎是一个XY问题。为什么你想要一个循环呢? –
循环将轮询来自外部API的数据并填充系统数据库。我不明白'XY问题'是什么意思。 – Vingtoft
你为什么使用芹菜任务?似乎是错误的用例 – Anentropic