私は、クライアントからの要求を受け入れる「ジョブ」サーバを持っています(別のマシンから要求を送信しているクライアントが8つあります)。次に、サーバーは「ジョブ」(「ジョブ」は結果ファイルをディスクに書き込む実行可能ファイル)を送信し、「ジョブマネージャー」スレッドはジョブが完了するまで待機します。ジョブが完了すると、結果ファイルがクライアントにコピーされる準備が整ったというメッセージをクライアントに送信します。読み取り可能なソケットタイムアウトrecv
inputs
受け入れた接続(ソケット)のリストであり、このリストには、
server
が含ま
readable, writable, exceptional = select.select(inputs, [], [])
:メインの私は、クライアントからの着信接続を読み取るためにselect
を使用したスレッドだけでなく、ジョブ要求に
ソケット。すべてのソケットは非ブロックに設定されています。私が最もよく理解するために、select
へのこの呼び出しが空でないreadable
を返す場合、それはinputs
のいくつかの要素が読み込みを待っている受信データを持っていることを意味します。私は次のロジックを使用してデータを読んでいます (SIZE
は一定である):たまに
- 私は
[Errno 110] Connection timed out
例外を取得し、私は理由を理解していない - の場合:for s in readable: if s is not server: try: socket_ok = True data = s.recv(SIZE) except socket.error as e: print ('ERROR socket error: ' + str(e)) socket_ok = False except Exception as e: print ('ERROR error reading from socket: ' + str(e)) socket_ok = False if not socket_ok: # do something
は、私は2つの問題を持っています私は読み取り可能なソケットを持っています、それはいくつかのデータが読み込まれていることを意味しないのですか?
- この例外を処理する方法 -
#do something
部分。私は 'クリーンアップ'を行うことができます - タイムアウトされたソケットによって要求された実行中のジョブを削除し、デッドソケットをリストから削除します。しかし、私は、クライアントに、これらの仕事の結果を待つことを止めるべきであることを知らせる方法がありません。理想的には、仕事自体が稼働し続けていて、私が捨てたくない結果を生み出すため、何とか再接続したいと考えています。ので、多分 - ジョブが終了した場合、スレッドは、関連するソケットを介してメッセージを「仕事を」送信 -
EDITは私が仕事マネージャのスレッドもQueue
インスタンスを経由してソケットへのアクセス権を持っていることを今実現しました同じソケットのsend
とrecv
メソッドは何らかの競合状態を引き起こしますか?しかし、とにかく、私はこれがどのように '接続タイムアウト'エラーを引き起こす可能性があります表示されません。
https://pymotw.com/2/select/ –
@ReutSharabani、私はそれを読んで、実際に私のコードはそれに基づいています。しかし、私のコードでは、 'readbale'リストのソケットから読み込みを行うと例外がスローされることがわかります。' Readableリストのすべてのソケットにバッファリングされ、読み込み可能な状態があります。これは私が持っている問題を説明していない –