在Python中,epoll能否避免errno.EWOULDBLOCK和errno.EAGAIN?

0 投票
1 回答
1793 浏览
提问于 2025-04-16 20:03

我在Python里写了一个epoll的封装,运行得还不错,但最近我发现发送大数据包时性能不太理想。我仔细查看了代码,发现其实有很多错误。

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

之前我按照文档的说法,把这些错误都忽略了,所以我的发送函数是这样写的:

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()

我在网上查了一下,发现这可能是因为网络缓冲区暂时用完了。那么我该怎么手动高效地检测这个错误,而不是让它进入异常处理阶段呢?

因为这样会花很多时间来抛出和处理异常。

1 个回答

1

使用 select 来检查一个套接字(socket)是否可以进行读取或写入操作。

撰写回答