1

スレッドは私の脳を溶かします。ワーカー + キープアライブ モデルを実装するさまざまな方法を見てきましたが、最適なアプローチを見つけるのは困難です。コードの簡略版は次のとおりです。

def start_thread(function):
    t = Thread(target=function)
    t.setDaemon(True)
    t.start()

def worker:
    run = True
    start_thread(keepalive_fn)

    msg = recv() #blocking
    while msg is not None and run:
        process(msg)
        try:
            msg = recv()
        except:
            if run:
                reconnect()
            break
    else:
        if run:
            reconnect()

def keepalive_fn():
    while run:
        try:
            send('hb')
        except:
            close_connection()
            break
        sleep(heartbeat)

def connect():
    open_connection()
    start_thread(worker)

def reconnect():
    close_connection()
    connect()

connect()

これは宣伝どおりに機能しますか? より良い方法はありますか?recv() がすでにこのケースを処理しているため、close_connection() が呼び出されたときに壊れた msg がないことに注意してください。

4

1 に答える 1

0

通常の方法は、recv() 呼び出しでタイムアウトを有効にすることです。ソケットにタイムアウトを設定するか、select/epoll() 呼び出しを使用して、ポーリングの発行とタイムアウトの両方に使用します。擬似:

bool timedOutOnce=false;
while(true){
  result=recv();
  if(result<>timeout){
       timedOutOnce=false;
       if (message<>serverPollReply) processMsg();
  }
  else
    {
      if(timedOutOnce){
         // server has not replied!!
         closeSocket;
         return(NoReplyFromServer);
      }
      else
        {
           // nothing received for a while, so..
           send(serverPollMessage);
           timedOutOnce=true;
        }
    }

}
于 2012-04-21T13:09:21.497 に答える