为什么将套接字放入队列会关闭它?

Why does putting a socket in a queue close it?

我正在编写一个由固定数量的工人操作的服务器,每个工人都有不同的属性(在下面的代码片段中,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''                                                                                                                                            

当方法 ThreadedHandler.handler 完成时,请求自动关闭。如果要保持套接字打开,则必须覆盖 TCPServer.shutdown_request