Как я могу помешать Django каналам убить мой продолжительный просмотр? - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть проект Django, который использует Django Каналы.

Django версия 2.2.10.

Django Каналы версии 2.3.0.

Приложение, над которым я сейчас работаю, НЕ использует Django Каналы - другие приложения в тех же проектах используют его.

Приложение, над которым я работаю, имеет простой вид:

def generate_usage_report(request):
    time.sleep(300)
    return HttpResponse("Done")

Это представление запускается по запросу AJAX, поэтому мне все равно, что для возврата потребуется 5 минут - браузер пользователя показывает строку загрузки, пока это не будет сделано.

К сожалению, примерно через 30 секунд (дать или взять) я получаю в своих журналах следующее:

WARNING  Application instance <Task pending coro=<AsgiHandler.__call__() running at /opt/my_project/venv3/lib/python3.6/site-packages/channels/http.py:192> wait_for=<Future pending cb=[_chain_future.<locals>._call_check_cancel() at /usr/lib64/python3.6/asyncio/futures.py:403, <TaskWakeupMethWrapper object at 0x7f02891c44c8>()]>> for connection <WebRequest at 0x7f02891c20f0 method=GET uri=/my_requested_page clientproto=HTTP/1.0> took too long to shut down and was killed.

И вызов Ajax никогда не завершается, так как вызов функции преждевременно прерывается. Есть ли какой-нибудь способ запустить его до завершения?

1 Ответ

0 голосов
/ 10 апреля 2020

Ты никогда не должен! на time.sleep на сервере. Это останавливает python на этот промежуток времени. ВСЕ из python (включая другие представления) и любой асин c runl oop, в котором вы находитесь.

Я бы предложил переместить это представление в AsyncHTTPConsumer в каналах, а затем сделать так, чтобы пользователь ничего не делал, блокирует python. (Короче говоря, если вы делаете что-либо, что занимает какое-то время, это должно быть await ed).

если вам нужно вызвать ba заблокировать код syn c, вы можете использовать:

  executor = ThreadPoolExecutor()
  await loop.run_in_executor(executor, your_big_blocking_funtion)
...