2016-09-21 18 views
1

私は、クライアントからの要求を受け入れる「ジョブ」サーバを持っています(別のマシンから要求を送信しているクライアントが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インスタンスを経由してソケットへのアクセス権を持っていることを今実現しました同じソケットのsendrecvメソッドは何らかの競合状態を引き起こしますか?しかし、とにかく、私はこれがどのように '接続タイムアウト'エラーを引き起こす可能性があります表示されません。

+0

https://pymotw.com/2/select/ –

+0

@ReutSharabani、私はそれを読んで、実際に私のコードはそれに基づいています。しかし、私のコードでは、 'readbale'リストのソケットから読み込みを行うと例外がスローされることがわかります。' Readableリストのすべてのソケットにバッファリングされ、読み込み可能な状態があります。これは私が持っている問題を説明していない –

答えて

0

クライアント側では、ブロックrecvメソッドを使用して、ジョブが完了したというメッセージをサーバーから取得しています。ジョブの実行に長い時間がかかることがある(たとえば、ジョブを実行しているクラスタのリソースが少ない場合)、待機しているソケットがタイムアウトの原因であったと推測しました。したがって、ブロックモードでrecvを使用する代わりに、タイムアウト時間が5秒であるため、サーバーに5秒ごとにダミーメッセージを送信して、メッセージが受信されるまで接続を維持します。今私はもう例外を(サーバー側で)得ることはありません。

関連する問題