2014-12-04 5 views
9

Ich möchte das Python 3 asyncio Modul verwenden, um eine Serveranwendung zu erstellen. Ich benutze eine Main Event-Schleife, um das Netzwerk zu hören, und wenn neue Daten empfangen werden, wird es einige berechnen und das Ergebnis an den Client senden. Benötigt 'etwas berechnen' eine neue Ereignisschleife? oder kann es die Main Event-Schleife verwenden?Sollte ich zwei asyncio Ereignisschleifen in einem Programm verwenden?

+0

suchen Sie etwas wie das Verbrauchermuster des Produzenten? http://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem –

+0

In diesem Fall können Sie den Hersteller als Prozess aus der Hauptschleife verwenden und benötigen nur eine Schleife. Es hängt von der Netzwerknutzung ab, dass ein Computer viele Netzwerkports hat. –

Antwort

9

Sie können die Rechenarbeit in der Hauptereignisschleife ausführen, aber die gesamte Ereignisschleife wird blockiert, während dies geschieht - keine anderen Anforderungen können bedient werden und alles, was Sie in der Ereignisschleife ausgeführt haben, wird blockiert. Wenn dies nicht akzeptabel ist, möchten Sie die Rechenarbeit wahrscheinlich in einem separaten Prozess mit BaseEventLoop.run_in_executor ausführen. Hier ist ein sehr einfaches Beispiel zeigt es:

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

Ausgang:

in worker 
done with coro 
got 7 

cpu_bound_worker in einem Kind-Prozess ausgeführt wird, und die Ereignisschleife für das Ergebnis warten, wie es jede andere nicht-blockierende I/O-Operation, damit andere Coroutinen nicht ausgeführt werden können.

Verwandte Themen