私は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
と以前にサイレントそれは、実際にありますました一時的にネットワークバッファが使い果たされていると言います どうすれば手動で効率的にこのエラーを検出できますか?
これは、例外を処理するのに多くの時間を要するためです。
okこれはソケットバッファがいっぱいになることを知っているので、私は手動でそれを増やしたので、私は手動でsock.setsockopt(socket.SOL_SOCKET、socket.SO_SNDBUF、1024 * 1024 * 10) を増やし、例外レートを遅くするでしょう – davyzhang