Python で複数 (約 100) の udp データグラム ソケットから読み取る最も簡単な方法を見つけようとしています。私はトルネードを見てきましたが、トルネードは udp サポートではなく http/tcp を宣伝しています。
現在、各 udp ソケット専用のスレッドがあります。ただし、これはあまり効率的ではないようです。
Python で複数 (約 100) の udp データグラム ソケットから読み取る最も簡単な方法を見つけようとしています。私はトルネードを見てきましたが、トルネードは udp サポートではなく http/tcp を宣伝しています。
現在、各 udp ソケット専用のスレッドがあります。ただし、これはあまり効率的ではないようです。
SocketServerモジュールには、スレッド化とフォークのオプションを備えた組み込みのUDP サーバーがあります。
別のオプションは、選択モジュールを使用することです。これにより、データが既に読み取り可能になっているソケットのみに集中できます。
私はそれを使ったことがないことを告白しなければなりませんが、多分ツイストはあなたのニーズに合うでしょう。
シリアル接続も含め、多くのプロトコルをサポートします。
すでに受け入れられている回答がありますが、最初の質問にコメントを追加したいと思います。
独立した処理(または少なくともあまり同期を伴わない処理)を必要とする複数の接続がある場合は、接続ごとに 1 つのスレッドを使用して読み取りをブロックしても問題ありません。現代のスケジューラは、そのためにあなたを殺すことはありません。これは、接続を処理するかなり効率的な方法です。メモリ フットプリントが気になる場合は、それに応じてスレッドのスタック サイズを減らすことができます (Python には適用されません)。
スレッド/プロセスは、ほとんどの時間 (新しいデータを待機している間) ビジーでない待機状態に留まり、CPU 時間を消費しません。
スレッドを使用したくない、または使用できない場合は、select
呼び出しが確実に適しています。これも低レベルで効率的な待機であり、ボーナスとして、トリガーされたソケットのリストを提供します。
トルネードのioloopの使用を主張し、UDPソケット処理を実行したい場合は、トルネードIOStreamのUDPバージョンを使用する必要があると思います。私は自分のプロジェクトでこれを成功させました。これをUDPStreamと呼ぶのは少し誤称ですが(ストリームではないため)、基本的な使用法はアプリケーションに統合するのが非常に簡単なはずです。
次のコードを参照してください:http://kyle.graehl.org/coding/2012/12/07/tornado-udpstream.html
asyncoroは、非同期の TCP および UDP ソケットを (他の多くの機能の中でも) サポートしています。他のフレームワークとは異なり、asyncoro でのプログラミングは、スレッドのプログラミングと非常によく似ています。説明するための簡単な UDP クライアント/サーバー プログラム:
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 は、可能な限り効率的なポーリング メカニズムを使用します。Windows および UDP ソケットでのみ非効率的な「select」を使用します (ただし、pywin32がインストールされている場合は、TCP に効率的な Windows I/O Completion Ports を使用します)。