Достигни огня и забудь в python и вернись из функции, прежде чем ждать результата - PullRequest
0 голосов
/ 11 июня 2019

В приложении Flask я загружаю файл на сервер. Я получаю файл от клиента, который отправляет файлы последовательно. Поэтому для ускорения загрузки я хочу вернуть клиенту успешный ответ, как только я сделаю запрос API загрузки, не дожидаясь ответа от сервера. Мне нужно добиться асинхронного поведения в моем приложении, аналогично тому, как работает узел.

Что мне нужно сделать, это

async def upload_file(f):
  result = await upload_api_call(f)
  ## do stuff based on result, in the background


def scp(data):
  file = data.file
  # upload file
  upload_file(f)
  # return success to client without waiting for upload to finish
  return 'success'

Я попытался использовать asyncio и смог получить асинхронное поведение. Однако проблема в том, что я все еще не могу отправить ответный ответ клиенту до завершения всего выполнения. Это связано с тем, что перед возвращением нужно использовать следующее в конце функции scp.

try:
  loop.run_forever()
finally:
  loop.close()

Это сводит на нет мою причину желать асинхронного поведения, поскольку я, по сути, жду загрузки, прежде чем вернуться к клиенту.

...