关于芹菜与Django的全球名单

时间:2017-11-29 14:43:27

标签: python django process celery

我使用Celery并拥有全局列表,因为我无法在Django中使用全局变量。 我根据需要将项目添加到该列表中。

问题在于,当我尝试从Celery获取全局列表时,有时我无法获得更新列表。 例如,当我知道我已经插入了项目时,我可能会得到空列表。

我看到here Celery运行了多个进程,所以我将Celery的运行命令编辑为 - celery -A tasks worker -c1,现在我应该只有一个进程但仍然出于某种原因我遇到了同样的问题。

注意:当我无法获得正确的列表时,我会刷新页面几次获取更新后的列表。

我认为Celery仍然可以运行一些流程而不是一个或几个线程,但它真的不应该因为我使用标志-c1

编辑:我认为可能很少有员工同时运行。我试图杀死它们,但每次我杀死它们时,都会以某种方式出生。

tasks.py

from celery import shared_task
from celery.task import periodic_task

import time
import threading

global_list = [[],[],[],[],[]]
global_list_protection = [[[],[],[]],[[],[],[]],[[],[],[]],[[],[],[]],[[],[],[]]]

@shared_task
def add(log_array, is_protection):

    i = 0
    if (is_protection == "true"):
        global global_list_protection

        while (i<len(global_list_protection) and global_list_protection[i]!= [[],[],[]]):
            i = i+1
        if (i<len(global_list_protection)):
            global_list_protection[i] = log_array
            return i
        return -1

    if (is_protection == "false"):
        global global_list

        while (i<len(global_list) and global_list[i]!= []):
        i = i+1

        if (i<len(global_list)):
            global_list[i] = log_array
            return i
        return -1
    return -1

@shared_task
def get(is_protection, index):


    if (is_protection == "true"):
        global global_list_protection
        return global_list_protection[int(index)]

    if (is_protection == "false"):
        global global_list
        return global_list[int(index)]
    return None

views.py

def send_to_celery(log_array, is_protection):
    from polls.tasks import add

    index_save = add(log_array, is_protection)
    return index_save


def get_from_celery(is_protection, index):
    from polls.tasks import get 

    log_array = get(is_protection, index)
    return log_array

1 个答案:

答案 0 :(得分:1)

您实际上并未在代码示例中使用Celery。芹菜任务可以像任何其他功能一样直接调用。只有在使用delay()之类的特殊芹菜方法时,才会将任务异步发送到芹菜。在您的示例中,您的代码在服务器线程中执行,因此依赖于调用该函数的线程。

即使我从未这样做过,您可能需要将任务发送到芹菜,然后等待返回结果。以下代码可以工作,但我没有测试它:

<强> views.py

def send_to_celery(log_array, is_protection):
    from polls.tasks import add

    async_result = add.delay(log_array, is_protection)
    index_save = async_result.get()
    return index_save

def get_from_celery(is_protection, index):
    from polls.tasks import get 

    async_result = get.delay(is_protection, index)
    log_array = async_result.get()
    return log_array