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?
9
A
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.
Üretici tüketici modeli gibi bir şey mi arıyorsunuz? http://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem –
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. –