Как получить доступ к значениям списка, который находится внутри tasks.py, через views.py, когда список заполняется, а задача еще не завершена? - PullRequest
1 голос
/ 06 мая 2019

У меня есть простая функция в 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 будет возвращено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...