用途:sock.shutdown (socket.SHUT_RD)
然後accept
將返回EINVAL
。不需要醜陋的十字線信號!
從Python文檔: 「注意close()
釋放資源與連接相關聯,但不一定立即關閉連接。如果你想關閉及時連接,調用shutdown()
close()
之前。」
http://docs.python.org/3/library/socket.html#socket.socket.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')
來源
2013-10-08 04:24:44
mpb
+1我的猜測是最後一個場景。線程1在接受時被阻塞。線程2關閉套接字。線程永遠阻塞。 – Duck 2012-02-20 17:21:05
這是正確的。請注意,您可能需要爲您使用的信號安裝一個空信號處理程序。 – caf 2012-02-21 02:24:37
哦,這部分POSIX真的很糟糕。 – thodg 2017-06-23 14:48:10