python socket对象接受超时

21 投票
3 回答
36083 浏览
提问于 2025-04-17 01:51

问题:在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)

据我所知,这将影响所有的套接字操作。

撰写回答