为什么将一个套接字放入队列中呢?

时间:2015-07-28 18:30:28

标签: python multithreading sockets socketserver

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

1 个答案:

答案 0 :(得分:1)

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