У меня есть простая функция в views.py , и мне нужно вызвать задачу в этой функции, чтобы что-то сделать и поместить результат в список. Итак, мне нужно прочитать первые 10 значений списка, пока список заполняется задачей, и она еще не завершена (или задача еще не завершена). Как я могу это сделать?
Я использую сельдерей 4.3.0 (ревень) и RabbitMQ 3.7.14 для обработки задач в Django 2.1.7
Поскольку более чем один пользователь может захотеть использовать веб-сайт, поэтому я думаю, что для каждого запроса ему нужно вызывать работника, поэтому я пытаюсь использовать задачу на основе классов, но это не рекомендуется в документации по сельдерею (хотя это не помогло решить мою проблему снова ) и я использую функциональное задание.
Функции просмотра и задачи, которые я ожидал выполнить, выглядят следующим образом:
views.py:
from .tasks import fetch
def search_result(request):
if request.method == 'POST':
my_task = fetch.delay(arg1, arg2)
my_task_id = my_task.task_id
while True:
if len(fetch.MAIN_LIST) > 9 :
initial = fetch.MAIN_LIST[0:10]
return HttpResponse(temp.render({'initial' : initial}, request))
elif AsyncResult(my_task_id).ready():
initial = fetch.main_list.get()
return HttpResponse(temp.render({'initial' : initial}, request))
else:
time.sleep(1)
tasks.py:
@shared_task
def fetch(larg1, arg2):
main_list = []
# do something and get result
main_list.append(result)
# this task is continuously doing until unknown time
Нужно сказать, что конфигурация сельдерея верна, потому что я тестирую ее в небольшом масштабе, когда fetch возвращает MAIN_LIST
, но в реальном проекте я не могу дождаться, когда задача закончится и MAIN_LIST
будет возвращено.