如何为Python的socket recv方法设置超时?
我想给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()
为所有套接字操作设置一个超时时间,但我看到你在另一个回答中明确拒绝了这个方案。