2011-06-22 11 views
0

私はpythonでepollラッパーを書いた、それはうまく動作しますが、最近私はパフォーマンスが大きなパッケージの送信には理想的ではないことがわかった。 、Pythonのepollで、私はerrno.EWOULDBLOCK、errno.EAGAINを避けることができますか?

def send_now(self): 
    '''send message at once''' 
    st = time.time() 
    times = 0 
    while self.response != '': 
     try: 
      num_bytes = self.sock.send(self.response) 
      l.info('msg wrote %s %d : %r size %r',self.ip,self.port,self.response[:num_bytes],num_bytes) 
      self.response = self.response[num_bytes:]      
     except socket.error,e: 
      if e[0] in (errno.EWOULDBLOCK,errno.EAGAIN): 
       #here I printed it, but I silent it in normal days 
       #print 'would block, again %r',tb.format_exc() 
       break 
      else: 
       l.warning('%r %r socket error %r',self.ip,self.port,tb.format_exc()) 
      #must break or cause dead loop 
      break      
     except: 
      #other exceptions 
      l.warning('%r %r msg write error %r',self.ip,self.port,tb.format_exc()) 
      break  
     times += 1 
    et = time.time() 

私はそれをググ:私はダウンコードに見て、文書が言ったように私の送信機能がこのように行われていたので、エラーのLOT

Traceback (most recent call last): 
    File "/Users/dawn/Documents/workspace/work/dev/server/sandbox/single_point/tcp_epoll.py", line 231, in send_now 
    num_bytes = self.sock.send(self.response) 
error: [Errno 35] Resource temporarily unavailable 

と以前にサイレントそれは、実際にありますました一時的にネットワークバッファが使い果たされていると言います どうすれば手動で効率的にこのエラーを検出できますか?

これは、例外を処理するのに多くの時間を要するためです。

+0

okこれはソケットバッファがいっぱいになることを知っているので、私は手動でそれを増やしたので、私は手動でsock.setsockopt(socket.SOL_SOCKET、socket.SO_SNDBUF、1024 * 1024 * 10) を増やし、例外レートを遅くするでしょう – davyzhang

答えて

1

selectを使用して、ソケットの読み取りまたは書き込みが可能かどうかを確認します。

+0

または投票、またはepoll、kevent、またはkqueueのいずれかです。くそー、私はあなたがこれをやることができる方法の数を誇りに思います。 –

+0

@Donal:そして​​彼らはすべて「選択」している。 –

+0

私はepollを行うために実際にselectパッケージを使用しました。私の質問は、読み書きの準備ができているかどうかを調べる方法ではありません。私は実際にその部分をしました。私は手動でerrno.EWOULDBLOCKとerrno.EAGAINを検出し、例外を発生させないようにする方法を見つけたいと考えています – davyzhang

関連する問題