Einfachste Weg, um Asynchronous Socket Reading von UDP in Python?

Ich versuche, den einfachsten Weg zu finden, von mehreren (ca. 100) udp Datagram Sockets in Python zu lesen. Ich habe Tornado angesehen, aber Tornado touts http / tcp anstatt udp Unterstützung.

Im Moment habe ich Threads gewidmet jeder udp-Steckdose; Das scheint aber nicht sehr effizient zu sein.

5 Solutions collect form web for “Einfachste Weg, um Asynchronous Socket Reading von UDP in Python?”

Ich muss gestehen, dass ich es nie benutzt habe.

Es unterstützt viele Protokolle, auch serielle Verbindungen.

Das SocketServer- Modul verfügt über einen eingebauten UDP-Server mit Optionen zum Threading und Forking.

Eine weitere Option ist die Verwendung des Auswahlmoduls, mit dem Sie sich nur auf die Steckdosen konzentrieren können, in denen Daten bereits zum Lesen verfügbar sind.

Ich möchte noch einige Kommentare zur ersten Frage hinzufügen, obwohl es bereits eine akzeptierte Antwort hat.

Wenn Sie mehrere Verbindungen haben, die eine unabhängige Verarbeitung benötigen (oder zumindest mit nicht viel Synchronisation verarbeiten), ist es in Ordnung, einen Thread pro Verbindung zu verwenden und zu blockieren. Moderne Scheduler werden dich nicht dafür töten. Es ist ein ziemlich effizienter Umgang mit den Verbindungen. Wenn Sie sich Gedanken über Speicherplatz haben, können Sie die Stapelgröße der Threads entsprechend reduzieren (gilt nicht für Python).

Die Threads / Prozesse bleiben in einem nicht-belebten Wartezustand für die meiste Zeit (beim Warten auf neue Daten) und verbrauchen keine CPU-Zeit.

Wenn du nicht willst oder keine Threads verwenden kannst, ist der select Call definitiv der Weg zu gehen. Dies ist auch Low-Level-und effizientes Warten und als Bonus, gibt Ihnen die Liste der Steckdosen, die ausgelöst.

Asyncoro unterstützt asynchrone TCP- und UDP-Sockets (unter vielen anderen Features). Im Gegensatz zu anderen Frameworks ist die Programmierung mit Asyncoro sehr ähnlich wie bei Threads. Ein einfaches UDP-Client / Server-Programm zur Veranschaulichung:

 import socket, asyncoro def server_proc(n, sock, coro=None): for i in xrange(n): msg, addr = yield sock.recvfrom(1024) print('Received "%s" from %s:%s' % (msg, addr[0], addr[1])) sock.close() def client_proc(host, port, coro=None): sock = asyncoro.AsynCoroSocket(socket.socket(socket.AF_INET, socket.SOCK_DGRAM)) msg = 'client socket: %s' % (sock.fileno()) yield sock.sendto(msg, (host, port)) sock.close() if __name__ == '__main__': sock = asyncoro.AsynCoroSocket(socket.socket(socket.AF_INET, socket.SOCK_DGRAM)) sock.bind(('127.0.0.1', 0)) host, port = sock.getsockname() n = 100 server_coro = asyncoro.Coro(server_proc, n, sock) for i in range(n): asyncoro.Coro(client_proc, host, port) 

Asyncoro nutzt möglichst effiziente Abrufmechanismen. Nur mit Windows- und UDP-Sockeln verwendet es ineffiziente 'select' (aber verwendet effiziente Windows I / O Completion Ports für TCP, wenn pywin32 installiert ist).

Ich denke, wenn Sie darauf bestehen, Tornados Ioloop zu benutzen und UDP-Socket-Verarbeitung zu machen, sollten Sie eine UDP-Version des Tornados IOStream verwenden. Ich habe das mit Erfolg in meinen eigenen Projekten gemacht. Es ist ein bisschen falsch, nennen es UDPStream (da es nicht ganz ein Stream ist), aber die grundlegende Verwendung sollte sehr einfach für Sie in Ihre Anwendung zu integrieren.

Siehe den Code unter: http://kyle.graehl.org/coding/2012/12/07/tornado-udpstream.html

  • Verwenden eines Sockels im UDP-Chat mit Threading
  • Python struct.pack () für einzelne Elemente in einer Liste?
  • Senden von Datei über UDP in Fragmente unterteilt
  • Entfernen von Padding aus UDP-Paketen in Python (Linux)
  • UDP-Tonübertragung: Gespielter Sound hat großes Rauschen
  • Python asyncore UDP Server
  • TTL des eingehenden UDP-Pakets in Python erhalten
  • Twisted UDP zu TCP Bridge
  • UDP-Client und Server mit Twisted Python
  • Python - Senden von Byte-Arrays über UDP ohne Listen oder Beizen?
  • Sind Datagramme immer vollständig erhalten?
  • Python ist die beste Programmiersprache der Welt.