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?
9
A
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
- 1. Asyncio Ereignisschleife pro Python-Prozess (AIOprocessing, mehrere Ereignisschleifen)
- 2. Warum verwenden Promise-Bibliotheken Ereignisschleifen?
- 3. Wann sollte ich asyncio über regulären Threads verwenden und warum? Bietet es Leistungssteigerungen?
- 4. Wie programmiere ich zwei AAC-Dateien in einem Programm?
- 5. Sollte ich Bootstrap verwenden?
- 6. Sollte ich Fremdschlüssel verwenden?
- 7. Sollte ich jQuery.each() verwenden?
- 8. Sollte ich jQuery.inArray() verwenden?
- 9. Verwenden von zwei JPanels in einem JFrame
- 10. Kooperative Ausbeute in asyncio
- 11. Wie IDataErrorInfo.Error in einem WPF-Programm verwenden?
- 12. Verwenden von exprtk in einem Multithread-Programm
- 13. Wann sollte ich \ A in einem Regex verwenden?
- 14. Sollte ich für immer/pm2 in einem (Docker) Container verwenden?
- 15. Warum sollte ich VOLUME in einem Dockerfile verwenden wollen?
- 16. Welche serverseitige Webtechnologie sollte ich in einem eingebetteten System verwenden?
- 17. Gui Toolkits, welche sollte ich verwenden?
- 18. Verwenden von Cython mit Asyncio (Python 3.4)
- 19. Wann sollte ich getElementById verwenden?
- 20. Welche Vorlage sollte ich in SimpleDateFormat verwenden?
- 21. Wann sollte ich RESTful verwenden?
- 22. Wie sollte ich Perls File :: Temp verwenden?
- 23. Welchen Fehlerwert sollte ich verwenden?
- 24. Asyncio coroutines
- 25. Python asyncio Debugging-Beispiel
- 26. Sollte ich SqlGeometry oder SqlGeography verwenden?
- 27. Wann ich ServiceTracker vs ServiceReference verwenden sollte
- 28. Wann sollte ich ConcurrentSkipListMap verwenden?
- 29. Sollte ich EAV-Modell verwenden?
- 30. Welches Layout sollte ich verwenden?
suchen Sie etwas wie das Verbrauchermuster des Produzenten? http://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem –
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. –