Tôi có một chuỗi chính chờ kết nối. Nó sinh ra các chuỗi khách hàng sẽ lặp lại phản hồi từ máy khách (telnet trong trường hợp này). Nhưng nói rằng tôi muốn đóng tất cả các ổ cắm và tất cả các chủ đề sau một thời gian, như sau 1 kết nối. Làm thế nào tôi sẽ làm gì? Nếu tôi làm clientSocket.close() từ chủ đề chính, nó sẽ không ngừng thực hiện recv. Nó sẽ chỉ dừng lại nếu tôi lần đầu tiên gửi một cái gì đó thông qua telnet, sau đó nó sẽ không làm tiếp tục gửi và recvs.Làm cách nào để hủy bỏ socket.recv() khỏi chuỗi khác trong Python
đang nhìn tôi như thế này:
# 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()
Bạn không thể làm điều đó với chủ đề vì CPython có Khóa thông dịch toàn cầu. http://docs.python.org/c-api/init.html#threads – badp