Python 选择后recv没有可用的数据 处境

Python 选择后recv没有可用的数据 处境,python,select,networking,nonblocking,recv,Python,Select,Networking,Nonblocking,Recv,我使用非阻塞udp套接字编写python客户机。有时我会 [Errno 11]资源暂时不可用 据我所知,这是因为我 使用非阻塞套接字 没有可用数据的非阻塞套接字上的recv() 我的代码是: def doRequestReply(self, addr, msg, readTimeout=2, writeTimeout=2): # Create Socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.s

我使用非阻塞udp套接字编写python客户机。有时我会

[Errno 11]资源暂时不可用

据我所知,这是因为我

  • 使用非阻塞套接字
  • 没有可用数据的非阻塞套接字上的recv()
我的代码是:

def doRequestReply(self, addr, msg, readTimeout=2, writeTimeout=2):
    # Create Socket
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.setblocking(0)

    ...
    # Send Request
    ...

    # Wait for Reply
    readable, _, exceptional = select.select([s], [], [s], readTimeout)
    if s in readable:
        data = s.recv(1024)

    ...

    s.close()
我有时会:

Traceback (most recent call last):
  File "/home/steffen/Desktop/shared/Monitor/CrawlerWorker.py", line 159, in run
    if not self.DoPeerExchange(peer, log=True):
  File "/home/steffen/Desktop/shared/Monitor/CrawlerWorker.py", line 106, in DoPeerExchange
    msg_rep = self.doRequestReply(addr, msg_req)
  File "/home/steffen/Desktop/shared/Monitor/CrawlerWorker.py", line 53, in doRequestReply
    data = s.recv(1024)
error: [Errno 11] Resource temporarily unavailable

问题: 如何可能引发异常。我的意思是select确保数据可以从这个套接字读取。我不应该得到这个错误

我在文件里找不到任何细节。只要我不知道错误发生的原因或它的含义,我就不想只知道错误。有人知道这种行为吗

谢谢

斯特芬

更新1 服务器部分还使用udp非阻塞套接字。只有一个线程正在使用select从该套接字读取数据

# Create a TCP/IP socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.setblocking(0)

while running:
    readable, _, exceptional = select.select([server], [], [server], 1)
    if server in readable:
        # Handle incoming connections
        data, client_address = server.recvfrom(1024)
        ...
大约一个小时后,他们又得到了:

Traceback (most recent call last):
  File "Sensor.py", line 87, in main
    data, client_address = server.recvfrom(1024)
error: [Errno 11] Resource temporarily unavailable
select是否确实确保数据可用?出现此异常的原因可能是什么?

请尝试:

select.select([s], [], [], readTimeout)
而不是

select.select([s], [], [s], readTimeout)
从文件中:

选择。选择(rlist,wlist,xlist[,超时])

  • rlist:等待阅读准备就绪
  • wlist:等待,直到准备好写作
  • xlist:等待“异常情况”(请参阅手册页了解您的系统如何考虑这种情况)

根据您的操作系统,可能是“异常情况”导致了这种情况。您应该
仅在“ready for reading”(准备读取)上选择

是否有多个进程从同一个套接字读取?我认为这是不可能的。如您所见,我在函数中创建了套接字,并在离开之前将其关闭。socket不是sharedI看到的,但是有时候人们在这里发布的代码是从真实的代码中缩写出来的。我现在完成了服务器部分。我再次看到同样的问题。只有主线程在循环中读取套接字!我不确定我是否理解正确。如果我从第三个列表中删除套接字,套接字仍然会返回到我的可读列表中。但是我应该首先检查异常输出列表“Exception condition”(异常条件)是复杂的、依赖于平台的,并且大部分与此无关。我认为UDP套接字上不会出现任何异常条件,所以这可能不是解决办法。可能是你是对的。尽管如此,我还是希望看到他进行测试。