python socket对象接受超时
问题:在Python中,socket.accept()函数有没有什么超时或者中断的方式?
信息:
我有一个程序,里面有一个子线程绑定了一个端口,它一直在接受连接,并把这些连接放到一个队列里,供主线程使用。现在我想让这个子线程能够中断,以便它可以正确地结束。我觉得我可以直接停止这个子线程,然后让父线程来处理它的结束,但有时候我希望能够提前从accept中返回,所以我觉得这样做会更有用。
所以,有没有办法让我设置一个超时,或者取消accept方法,这样线程就可以在没有连接进来的情况下返回?
3 个回答
8
也许你在找的就是 settimeout() 这个功能。
21
你可以像下面这个例子一样使用 settimeout()
:
import socket
tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpServer.settimeout(0.2) # timeout for listening
tcpServer.bind(('0.0.0.0', 10000)) # IP and PORT
tcpServer.listen(1)
stopped = False
while not stopped:
try:
(conn, (ip, port)) = tcpServer.accept()
except socket.timeout:
pass
except:
raise
else:
# work with the connection, create a thread etc.
...
这个循环会一直运行,直到 stopped
被设置为 true,然后在你设定的超时时间后退出。(在我的应用中,我把连接的句柄传给一个新创建的线程,然后继续这个循环,以便能够接受更多的同时连接。)
15
你可以通过以下方式设置默认的超时时间:
import socket
print socket.getdefaulttimeout()
socket.setdefaulttimeout(60)
据我所知,这将影响所有的套接字操作。