代码之家  ›  专栏  ›  技术社区  ›  zeenfaiz

Django和Celery的全局变量

  •  1
  • zeenfaiz  · 技术社区  · 11 年前

    我有一个这样的代码,

    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方法是由芹菜任务调用的。请帮我解决这个问题。

    2 回复  |  直到 2 年前
        1
  •  3
  •   Daniel Roseman    11 年前

    如果你在做 任何东西 在Django项目中使用全局变量,这是错误的。在这种情况下,Celery和Django在完全独立的进程中运行,因此无法共享数据。您需要让Celery将数据存储在数据库或文件中的某个位置,以便Django能够获取并提供数据。

        2
  •  0
  •   Super Kai - Kazuya Ito    2 年前

    下面的代码适用于 全局变量 num 我在 Django 3.1.7项目 芹菜5.1.2 .*然而,有时全局变量在具有不同代码的芹菜任务之间不能正常工作,因此您应该避免在芹菜任务中使用全局变量:

    # "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