2015-01-29 22 views
10

Ben şu komutla geliştiriyorum Django uygulaması ile Gunicorn içinde gaiohttp işçisi kullanmaya çalışıyorum:Asyncio ile gunicorn kullanırken başka bir isteği nasıl sağlayabilirim?

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

Benim nihai hedefi eşzamanlı istekleri işlemeye muktedir olduğunu - yani var 1 gunicorn işçisi eşzamanlı olarak çoklu istekleri işlemek. Bu istekleri yavaşlatan G/Ç bağlı işlemleri vardır.

Ben isteği işlerken olduğumda bir olay döngü zaten çalışıyor biliyorum:

class MyView(View): 

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

Sorular:

  1. nasıl böyle benim bakış kodu içinde yield from asyncio.sleep(10) gibi bir işlemi gerçekleştirebilir?

    class MyView(View): 
    
        def get(self, request): 
         # Raises AssertionError: yield from wasn't used with future 
         yield from asyncio.sleep(10) 
    
  2. @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. Ben geleceği kullanmayı deneyin isteği işlenirken Ancak onlar blok yok, olay döngü görevleri ekleyebilir, ancak olay döngü zaten

    çalışıyor
    @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()) 
    

Açıkça ben asyncio veya gaiohttp hakkında anlayamıyorum şey var.

Geçerli istekler için asyncio.sleep(10) bloğunu nasıl alabilirim, ancak diğer isteklerin işlenmesini engellemeyin?

+0

Diğer gunicorn kullanıcıları Andrew ile aynı şeyden bahsetti - bkz. Http://lists.gunicorn.org/user/74434.html - Ne yazık ki vazgeçtim ve bunun yerine Tornado çerçevesini kullanmaya başladım. –

cevap

6

Maalesef bulunduğunuz WSGI uygulamasından coroutines diyemezsin - WSGI bunun üstüne (Django, Flask, Piramit) üzerine inşa çerçeveler yanı sıra senkron protokoldür.

gaiohttp çalışanı uyguladım ancak asyncio dünyasında ikinci sınıf vatandaşı. Asenkronize HTTP sunucusuna gerçekten ihtiyacınız varsa lütfen aiohttp.web'u deneyin.