Django和Celery的全局变量



我有一个这样的代码,

wl_data = {}
def set_wl_data():
    global wl_data
    wl_data = get_watchlist_data()

def get_wl_data(scripcodes):
    # Filtering Data
    result = {scripcode:detail for scripcode, detail in wl_data.iteritems() if int(scripcode) in scripcodes or scripcode in scripcodes}
    return result

我把这个作为django项目来运行,我正在调用来自芹菜的setter方法,以更新全局变量wl_data
tastypieapi将调用getter方法get_wl_data来获取全局变量wl_data。

问题是芹菜没有正确更新wl_data。但是当我们在浏览器中点击tastypieapi-url时,getter方法服务于旧数据。

堆栈溢出中有很多相关的问题,但这里的不同之处在于setter方法是由芹菜任务调用的。请帮我解决这个问题。

如果你在Django项目中用全局变量做任何的事情,那你就错了。在这种情况下,Celery和Django在完全独立的进程中运行,因此无法共享数据。您需要让Celery将数据存储在数据库或文件中,这样Django就可以提取并提供数据

下面的代码在Django 3.1.7Celery 5.1.2中与全局变量num一起使用。*但是,有时全局变量在与下面的代码不同的芹菜任务之间不能正常工作,因此您应该避免在芹菜任务中使用全局变量:

# "store/tasks.py"
from celery import shared_task
num = 0
@shared_task
def test1():
    global num
    num += 1
    return num
@shared_task
def test2():
    global num
    num += 1
    return num
@shared_task
def test3():
    global num
    num += 1
    return num
# "store/views.py"
from django.http import HttpResponse
from .tasks import test1, test2, test3
def test(request):
    test1.delay()
    test2.delay()
    test3.delay()
    return HttpResponse("Test")

输出:

Task store.tasks.test1[c222183b-73be-4fba-9813-be8141c6669c] received
Task store.tasks.test1[c222183b-73be-4fba-9813-be8141c6669c] succeeded in 0.0s: 1
Task store.tasks.test2[aa4bc9e5-95c6-4f8b-8122-3df273822ab5] received
Task store.tasks.test2[aa4bc9e5-95c6-4f8b-8122-3df273822ab5] succeeded in 0.0s: 2
Task store.tasks.test3[472727f3-368f-48ad-9d49-72f14962e8c5] received
Task store.tasks.test3[472727f3-368f-48ad-9d49-72f14962e8c5] succeeded in 0.0s: 3

相关内容

  • 没有找到相关文章