Próbuję użyć pracownika gaiohttp w Gunicorn z aplikacji Django Zajmuję się za pomocą następującego polecenia:Jak przejść do innego żądania przy użyciu gunicorn z asyncio?
gunicorn -k gaiohttp -b localhost:8080 myproject.wsgi
Moim ostatecznym celem jest być w stanie przetworzyć żądania jednocześnie - czyli mieć pracownika 1 gunicorn przetwarzaj jednocześnie wiele żądań. Istnieją operacje związane z wejściem/wyjściem, które spowalniają te żądania.
wiem pętla zdarzeń jest już uruchomiony, gdy jestem przetwarzania żądania:
class MyView(View):
def get(self, request):
loop = asyncio.get_event_loop()
loop.is_running() # True
...
Pytania:
Jak mogę wykonać operację, takich jak
yield from asyncio.sleep(10)
w moim kodu View?class MyView(View): def get(self, request): # Raises AssertionError: yield from wasn't used with future yield from asyncio.sleep(10)
mogę dodać zadań do pętli zdarzeń, jednak nie blokują podczas przetwarzania żądania
@asyncio.coroutine def simulate_work(): yield from asyncio.sleep(10) class MyView(View): def get(self, request): # This runs simulate_work(), however, it doesn't block # the response is returned before simulate_work() is finished loop = asyncio.get_event_loop() task = loop.create_task(simulate_work())
próbuję użyć futures, ale pętla zdarzeń jest już uruchomiony
@asyncio.coroutine def simulate_work(future): yield from asyncio.sleep(10) future.set_result('Done!') class MyView(View): def get(self, request): future = asyncio.Future() asyncio.async(simulate_work(future)) loop = asyncio.get_event_loop() # Raises RuntimeError: Event loop is running. loop.run_until_complete(future) print(future.result())
Najwyraźniej jest coś, czego nie rozumiem w kwestii asyncio lub gaiohttp.
Jak mogę mieć blokdla bieżących żądań, ale nie blokować gunicorn przed przetwarzaniem innych żądań?
Inni użytkownicy gunicorn wspomnieli to samo co Andrew - patrz http://lists.gunicorn.org/user/74434.html - Niestety, zrezygnowałem i zacząłem używać frameworków Tornado. –