为什么将套接字放入队列会关闭它?
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
。
我正在编写一个由固定数量的工人操作的服务器,每个工人都有不同的属性(在下面的代码片段中,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
。