我有一個等待連接的主線程。它會產生客戶端線程來回應來自客戶端的響應(在這種情況下是telnet)。但是,說一段時間後,我想關閉所有套接字和所有線程,例如1次連接之後。我該怎麼辦?如果我從主線程執行clientSocket.close(),它不會停止執行recv。只有當我第一次通過telnet發送一些東西時,它纔會停止,然後它會進行進一步的發送和recv失敗。如何從Python中的另一個線程中止socket.recv()
我的代碼如下所示:
# Echo server program
import socket
from threading import Thread
import time
class ClientThread(Thread):
def __init__(self, clientSocket):
Thread.__init__(self)
self.clientSocket = clientSocket
def run(self):
while 1:
try:
# It will hang here, even if I do close on the socket
data = self.clientSocket.recv(1024)
print "Got data: ", data
self.clientSocket.send(data)
except:
break
self.clientSocket.close()
HOST = ''
PORT = 6000
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serverSocket.bind((HOST, PORT))
serverSocket.listen(1)
clientSocket, addr = serverSocket.accept()
print 'Got a new connection from: ', addr
clientThread = ClientThread(clientSocket)
clientThread.start()
time.sleep(1)
# This won't make the recv in the clientThread to stop immediately,
# nor will it generate an exception
clientSocket.close()
由於CPython具有全局解釋器鎖定,因此無法使用線程完成此操作。 http://docs.python.org/c-api/init.html#threads – badp 2010-05-26 18:03:23