2015-01-29 2 views
10

Ich versuche, die gaiohttp Arbeiter in Gunicorn mit Django app mit dem folgenden Befehl Ich entwickle zu verwenden:Wie Ausbeute ich auf eine andere Anfrage, wenn sie mit asyncio mit gunicorn?

gunicorn -k gaiohttp -b localhost:8080 myproject.wsgi 

Mein Ziel ist es, Anforderungen gleichzeitig zu verarbeiten - dh sie haben 1 gunicorn Arbeiter Verarbeiten Sie mehrere Anfragen gleichzeitig. Es gibt I/O-gebundene Operationen, die diese Anforderungen verlangsamen.

Ich weiß, dass eine Ereignisschleife bereits ausgeführt wird, wenn ich eine Anfrage ist bin:

class MyView(View): 

    def get(self, request): 
     loop = asyncio.get_event_loop() 
     loop.is_running() # True 
     ... 

Fragen:

  1. Wie kann ich eine Operation wie yield from asyncio.sleep(10) innerhalb meiner Ansicht Code ausführen?

    class MyView(View): 
    
        def get(self, request): 
         # Raises AssertionError: yield from wasn't used with future 
         yield from asyncio.sleep(10) 
    
  2. kann ich Aufgaben zu der Ereignisschleife hinzufügen, aber sie nicht blockieren, während der Verarbeitung der Anforderung

    @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. Ich versuche, Futures zu verwenden, aber die Ereignisschleife bereits ausgeführt wird

    @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()) 
    

klar ist es etwas, was ich nicht über asyncio oder gaiohttp zu verstehen.

Wie kann ich asyncio.sleep(10) Block für die aktuellen Anfragen, aber nicht gunicorn blockieren Verarbeitung andere Anfragen?

+0

Andere gunicorn Benutzer erwähnt die gleiche Sache wie Andrew - siehe http://lists.gunicorn.org/user/74434.html - Leider anstatt den Tornado-Framework, das habe ich aufgeben und begann. –

Antwort

6

Entschuldigung, Sie können keine Coroutinen aus Ihrer wsgi-Anwendung aufrufen - WSGI ist synchrone Protokoll, sowie Frameworks auf ihm (Django, Flask, Pyramid) gebaut.

Ich habe gaiohttp Arbeiter umgesetzt, aber es ist Bürger zweiter Klasse in asyncio Welt. Wenn Sie wirklich asynchronen HTTP-Server benötigen, bitte versuchen aiohttp.web.

Verwandte Themen