我正在编写一个服务器,该服务器使用固定数量的工作人员,每个人都有不同的属性(在下面的代码段中,n
就是这样的属性。
收到请求后,我想将其放入队列,因此第一个可用的工作人员可以处理该任务。
不幸的是,套接字在排队时会被关闭。
import threading
from queue import Queue
import socketserver
thread = True
queue = Queue()
class BasicHandler(socketserver.BaseRequestHandler):
def handle(self):
while True:
sock = self.request
byte = sock.recv(10)
print(byte)
class ThreadedHandler(socketserver.BaseRequestHandler):
def handle(self):
queue.put(self.request)
def worker(n):
print('Started worker ' + str(n))
while True:
sock = queue.get()
byte = sock.recv(10)
print(byte)
if thread:
[threading.Thread(target=worker, args=(n,)).start() for n in range(2)]
handler = ThreadedHandler
else:
handler = BasicHandler
socketserver.TCPServer.allow_reuse_address = True
server = socketserver.TCPServer(("localhost", 9999), handler)
server.serve_forever()
使用thread = False
运行上述代码段工作正常,但当我尝试连接到thread = True
版本时,telnet立即说:
Connection closed by foreign host.
并且服务器打印:
Started worker 0
Started worker 1
b''
答案 0 :(得分:1)
当方法ThreadedHandler.handler
完成时,请求会自动关闭。如果要保持套接字打开,则必须覆盖TCPServer.shutdown_request
。