2015-01-29 18 views
10

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:

  1. 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) 
    
  2. 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()) 
    
  3. 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ń?

+0

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. –

Odpowiedz

6

Niestety, nie można wywoływać coroutines z aplikacji WSGI - WSGI to protokół synchroniczny, a także konstrukcje na nim zbudowane (Django, Flask, Pyramid).

Mam zaimplementowane gaiohttp pracownika, ale jest obywatelem drugiej kategorii w świecie asyncio. Jeśli naprawdę potrzebujesz asynchronicznego serwera HTTP, spróbuj aiohttp.web.

Powiązane problemy