2016-11-16 3 views
0

私はいくつかのソケットを同時に開くソケットクライアントを実装しています。どんなソケットにも異なる時刻にデータがある可能性があり、ソケットにデータがあり、読み込み可能なときにコードを実行したい。ソケットにデータがあるのを待つ方法は?

私はこれを実装する方法を、私はselect.selectを見ていたかわからないが、読みやすいように、すべてのソケットを待つように思われます。

私はそれが各ソケットからの読み込みで連続することが、利用可能なデータがあるときに読みたい、ソケット上のデータを処理するためのマルチプロセッシングを使用しないようにしたいと思います。

にはどうすれば読めるように任意のソケットのを待つのですか?

# psudo code 

sockets = [sock1, sock2, sock3] 

while True: 
    if len(sockets) == 0: 
    break 
    for sock in sockets: 
    if sock.has_data(): 
     do_stuff(sock) 
     sockets.remove(sock) 
    sleep(0.1) 
+2

'SELECT'が読めるように、すべてのソケットを待たない、それが返されます。 –

+2

何をしても、ブロックしたくない場合は、ソケットを非ブロックにすることを忘れないでください。あなたが使用するすべての機能は、将来を予測するために使用することができないステータスレポート機能になります。ブロッキングread *は、 'select 'が何であってもブロックすることができます。 –

答えて

1

はあなたがあなたの問題のためselect.selectを使用することができます標準ライブラリにselectorsモジュールがあります。それはあなたのシステムが提供する(選択し、世論調査、kqueueの...)「最高の」I/Oの多重化の実装のために、こののbackportをありますドキュメントのページhttps://docs.python.org/3/library/selectors.html

の最後に、単純なエコーサーバの例がありますが使用されます古いPythonバージョンも利用可能です。そのうちの一つが読めるしたら

+0

ソケットを非ブロックにすることを忘れないでください。 –

+0

OPは物事をした後にソケットを取り除くので、OPはブロックしたい。 – Daniel

+0

本当に、私はブロックしたいですか? また、ダニエルに感謝します。私は自分の試みで間違いを犯したと思います。私は選択したものを正確に実装することができました! :) – MatUtter

1

あなたがPOSIX上にある場合は、select.pollを見てみましょう:あなたは、Python 3.4以降を使用している場合

sockets = [sock1, sock2, sock3] 
while sockets: 
    rlist, _, _ = select.select(sockets, [], []) 
    for sock in rlist: 
     do_stuff(sock) 
     sockets.remove(sock) 
1

import socket 
import select 
p = select.poll() 
s1 = socket.socket() 
s2 = socket.socket() 
# call connect on sockets here... 
p.register(s1, select.POLLIN) 
p.register(s2, select.POLLIN) 
p.poll() 
関連する問題