在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。

问题:实现该功能的最佳方法是什么? 我正在考虑设置一个数据库变量,但恐怕它不是最好的方法。

+0

这似乎是一个XY问题。为什么你想要一个循环呢? –

+0

循环将轮询来自外部API的数据并填充系统数据库。我不明白'XY问题'是什么意思。 – Vingtoft

+0

你为什么使用芹菜任务?似乎是错误的用例 – Anentropic

其中一种可能的方法是创建将永久运行然后根据请求停止的任务。

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