Ich habe kürzlich gelesen this document, die eine Reihe von Strategien auflistet, die verwendet werden könnten, um einen Socket-Server zu implementieren. Das heißt, sie sind:Schreiben eines Socket-basierten Servers in Python, empfohlene Strategien?
- viele Kunden mit jedem Thread dienen und nicht blockierend verwenden I/O und pegelgetriggert Bereitschaft Benachrichtigung
- Serve viele Kunden mit jedem Thread, und verwenden Sie nicht blockierende E/A und die Bereitschaft Änderungsbenachrichtigung
- dienen vielen Clients mit jedem Server-Thread, und verwenden asynchrone I/O
- einen Client mit jedem Server-Thread dienen, und die Blockierung/I O des Server-Code in den Kernel
Jetzt würde ich mich über einen Hinweis freuen, der verwendet werden sollte in CPython, die wir wissen, hat einige gute Punkte und einige schlechte Punkte. Ich bin vor allem an Performance unter hoher Parallelität interessiert, und ja, einige der aktuellen Implementierungen sind zu langsam.
Also wenn ich mit dem einfachen beginnen kann, ist "5" out, da ich nichts in den Kernel hacken werde.
"4" Sieht auch wie es muss wegen der GIL aus sein. Natürlich könnte man hier Multiprocessing anstelle von Threads verwenden, und das gibt einen deutlichen Schub. Das Blockieren von IO hat auch den Vorteil, dass es leichter zu verstehen ist.
Und hier mein Wissen schwindet ein wenig:
„1“ ist traditionell wählen oder Umfrage, die trivialen mit Multiprozessing kombiniert werden könnte.
„2“ ist die Bereitschaft-Änderungsmitteilung, durch die neuere epoll verwendet und kqueue
„3“ Ich bin nicht sicher, dass alle Kernel-Implementierungen für diese gibt, die Python-Wrapper haben.
Also, in Python haben wir eine Tasche mit tollen Tools wie Twisted. Vielleicht sind sie ein besserer Ansatz, obwohl ich Twisted getestet habe und es auf einem Multiprozessor-Rechner zu langsam fand. Vielleicht weiß ich es nicht, wenn ich 4 Twists mit einem Load Balancer habe. Jeder Rat würde geschätzt werden.
Ich denke, dass epoll ist in der stdlib in 2.6+ und easy_installable für 2.5. Das Paket heißt Select-Something. Entschuldigung für Unklarheit. –
Twisted kann auch Epoll verwenden. Tatsächlich verwandelt Twisted alle unterstützten Ereignisbenachrichtigungs-APIs in eine einheitliche API, die es Ihnen präsentiert. Also, wenn das Beste, was die Plattform tun kann, wählen Sie, wählt Ihre App aus. Wenn es epoll hat, verwendet Ihre App epoll. Alles transparent für dich. –
Es ist buchstabiert "asyncore" – new123456