我使用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
答案 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