Как ждать результатов от сельдерея в Джанго - PullRequest
0 голосов
/ 18 января 2019

У меня есть задача сельдерея, которая отправляет данные в другой сервис. Я добавил задачу сельдерея send_inventory_request в RequestSupplyStock представление на основе классов. Когда я делаю пост, я должен сначала получить результаты от задачи сельдерея, а затем продолжить и вернуть ответ. Я хотел бы сначала дождаться результата от задачи сельдерея, а затем вернуть ответ от метода post, который является правильным способом для достижения этой цели.

@app.task
def send_inventory_request(payload,token):
    auth = {'authorization':token}
    HEADERS.update(auth)
    url = PROCUREMENT_SUPPLY_STOCK_REQUESTS_URL
    res = requests.post(url,json=payload,headers=HEADERS)
    inventory_request_data = res.json()
    x= logger.info('Supply Stock Request {0} + {1}'.format(payload,token))
    print(x)
    return inventory_request_data 

View

class RequestSupplyStock(generics.CreateAPIView):

      def post(self, request, format=None):
          ........

          send_inventory_request.delay(payload,get_token(request))

          .........
          return Response(status=status.HTTP_201_CREATED)

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Как уже упоминалось в комментарии других, ожидание результата в синхронном режиме отрицательно сказывается на цели использования сельдерея, но если вам все еще нужно ждать результата, то не delay.

Просто вызовите задачу как обычный метод, и она будет выполняться синхронно и вернет результат:

send_inventory_request(payload,get_token(request))
0 голосов
/ 18 января 2019

Вы можете использовать сельдерей ждать , но это не рекомендуется

Ожидание задач внутри задачи может привести к тупикам. Пожалуйста, прочитайте Избегайте запуска синхронных подзадач.

task = send_inventory_request.delay(payload,get_token(request))
result = task.wait(timeout=None, interval=0.5)
...