Python:为什么这个非阻塞的recv调用会阻塞?

0 投票
1 回答
1375 浏览
提问于 2025-04-16 22:31

我在一个线程的 $init 调用中有以下代码:

self.conn = copy.deepcopy(conn)
self.conn.setblocking(0)

这里的 conn 是一个套接字(socket),它作为参数传递给 $init。每个线程都会收到一个独特的套接字。在 run 方法中,我有:

self.running = True
self.conn.send("Connected")
print self.name, "has a timeout of", self.conn.gettimeout()

while self.running:
    try:
        now = self.conn.recv(8192)
        print "Recieved:", now, "\n\tFrom:", self.name
        self.process(now)
    except socket.error:
         raise

     print "hi from", self.name
     time.sleep(1)

超时时间打印出来是 0.0,但只有在收到消息时才会打印出 "hi from threadname",而且异常从来没有被抛出!看起来 recv 方法在阻塞,但为什么会这样呢?

1 个回答

1

可能是因为recv在从文件中读取数据,而输入输出操作是阻塞的?(你可能知道,套接字也是文件) :)

想了解更多信息,可以看看这里: python socket.recv/sendall调用阻塞 :)

撰写回答