首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在python的socket recv方法上设置超时?

如何在python的socket recv方法上设置超时?
EN

Stack Overflow用户
提问于 2010-04-27 13:51:47
回答 10查看 280.7K关注 0票数 150

我需要在python的socket recv方法上设置超时。该怎么做呢?

EN

回答 10

Stack Overflow用户

发布于 2010-04-27 21:49:30

典型的方法是使用select()等待,直到数据可用或超时。只有在数据实际可用时才调用recv()。为了安全起见,我们还将套接字设置为非阻塞模式,以保证recv()永远不会无限期地阻塞。select()还可用于同时等待多个套接字。

代码语言:javascript
复制
import select

mysocket.setblocking(0)

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

如果您有很多打开的文件描述符,那么poll()是比select()更有效的替代方案。

另一种选择是使用socket.settimeout()为套接字上的所有操作设置超时,但我看到您在另一个答案中明确拒绝了该解决方案。

票数 141
EN

Stack Overflow用户

发布于 2010-04-27 13:56:31

票数 72
EN

Stack Overflow用户

发布于 2014-08-28 01:15:52

如前所述,select.select()socket.settimeout()都可以工作。

注您可能需要调用settimeout两次,例如

代码语言:javascript
复制
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)
票数 52
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2719017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档