2014-12-04 22 views
9

Bir sunucu uygulaması oluşturmak için Python 3 asyncio modülünü kullanmak istiyorum. Ağı dinlemek için bir ana olay döngüsü kullanıyorum ve yeni veriler alındığında, bazı hesaplamalar yapar ve sonucu istemciye gönderir. 'Bazı hesaplamalar' yeni bir olay döngüsüne mi ihtiyaç duyar? veya ana olay döngüsünü kullanabilir mi?Bir programda iki asyncio olay döngüsü kullanmalı mıyım?

+0

Üretici tüketici modeli gibi bir şey mi arıyorsunuz? http://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem –

+0

Bu durumda, üreticiyi ana döngüden işlem olarak kullanabilir ve sadece bir döngüye gereksinim duyarsınız. Bu ağ kullanımı bir bilgisayara bir çok ağ bağlantı noktasına sahip. –

cevap

9

Sen ana olay döngü içinde hesaplama işi yapabilir, ama bu olur ise bütün olay döngü engellenir - diğer istekler servis edilebilir ve olay döngü içinde çalışan var başka bir şey engellenecektir. Bu kabul edilebilir değilse, muhtemelen hesaplama işlemini BaseEventLoop.run_in_executor kullanarak ayrı bir işlemde çalıştırmak isteyebilirsiniz.

import time 
import asyncio 
from concurrent.futures import ProcessPoolExecutor 

def cpu_bound_worker(x, y): 
    print("in worker") 
    time.sleep(3) 
    return x +y 

@asyncio.coroutine 
def some_coroutine(): 
    yield from asyncio.sleep(1) 
    print("done with coro") 

@asyncio.coroutine 
def main(): 
    loop = asyncio.get_event_loop() 
    loop.set_default_executor(ProcessPoolExecutor()) 
    asyncio.async(some_coroutine()) 
    out = yield from loop.run_in_executor(None, cpu_bound_worker, 3, 4) 
    print("got {}".format(out)) 

loop = asyncio.get_event_loop() 
loop.run_until_complete(main()) 

Çıktı:

in worker 
done with coro 
got 7 

cpu_bound_worker çocuk sürecinde çalıştırılmaktadır ve olay döngü böyle sonuç bekler başka herhangi engellenmeyen ben İşte gösteren çok basit bir örnek/O işlemi, bu nedenle diğer koroutinlerin çalışmasını engellemez.

İlgili konular