如何为Python的socket recv方法设置超时?

180 投票
11 回答
369188 浏览
提问于 2025-04-15 22:03

我想给Python的socket接收方法设置一个超时时间。该怎么做呢?

11 个回答

60

正如提到的,select.select()socket.settimeout() 都可以使用。

需要注意的是,你可能需要调用 settimeout 两次来满足你的需求,比如:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("",0))
sock.listen(1)
# accept can throw socket.timeout
sock.settimeout(5.0)
conn, addr = sock.accept()

# recv can throw socket.timeout
conn.settimeout(5.0)
conn.recv(1024)
89

这里提到的是一个叫做 socket.settimeout() 的函数,你可以在这个链接里找到更多信息。

154

通常的做法是使用 select() 来等待数据的到来,或者等到超时发生。只有在数据真的可用的时候才调用 recv()。为了安全起见,我们还会把套接字设置为非阻塞模式,这样可以确保 recv() 不会一直卡在那里不动。select() 还可以用来同时等待多个套接字。

import select

mysocket.setblocking(0)

ready = select.select([mysocket], [], [], timeout_in_seconds)
if ready[0]:
    data = mysocket.recv(4096)

如果你有很多打开的文件描述符,使用 poll() 会比 select() 更高效。

另一个选择是使用 socket.settimeout() 为所有套接字操作设置一个超时时间,但我看到你在另一个回答中明确拒绝了这个方案。

撰写回答