用途:sock.shutdown (socket.SHUT_RD)
然后accept将返回EINVAL。不需要丑陋的十字线信号!
从Python文档: “注意close()释放资源与连接相关联,但不一定立即关闭连接。如果你想关闭及时连接,调用shutdown()close()之前。”
我多年前就遇到了这个问题,而编程C.但是我只找到了解决的今天,运行到同样的问题在Python和使用琢磨后信号(呸!),然后记住关于shutdown的笔记!
至于说不应该关闭/使用跨线程的套接字...在CPython中,全局解释器锁应该保护你(假设你使用文件对象而不是原始的整型文件描述符)。
下面是示例代码:
import socket, threading, time
sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt (socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind (('', 8000))
sock.listen (5)
def child():
print ('child accept ...')
try: sock.accept()
except OSError as exc : print ('child exception %s' % exc)
print ('child exit')
threading.Thread (target = child).start()
time.sleep (1)
print ('main shutdown')
sock.shutdown (socket.SHUT_RD)
time.sleep (1)
print ('main close')
sock.close()
time.sleep (1)
print ('main exit')