我试图创建线程池来同时对传入的tcp包执行一些操作。在
我在python3中找不到任何内置线程池。我也读了一些关于multiprocessing.Pool的文章,但是它不支持内存共享。所以我使用Queue来模拟线程池。在
为每个线程创建一个队列是否更好?
有没有人有建议或更好的解决方案来改进以下自定义线程池代码?在import socketserver
import threading
from queue import Queue
class ThreadPool:
tcp_queue = Queue()
# redis = redis connection
def __init__(self, thread_worker_numbers=10):
for i in range(thread_worker_numbers):
threading.Thread(target=self.worker).start()
def worker(self):
while True:
packet = self.tcp_queue.get()
print('thread: %s received packet: %s' % (threading.current_thread().getName(), packet))
# TODO do process on packet
def queue(self, packet):
self.tcp_queue.put(packet)
def queue_count(self):
return self.tcp_queue.qsize()
class TCPServerHandler(socketserver.BaseRequestHandler):
thread_pool = ThreadPool()
def handle(self):
# self.request is the TCP socket connected to the client
self.data = self.request.recv(1024).strip()
packet = self.data.decode("utf-8")
print(packet)
self.thread_pool.queue(packet)
# print("%s wrote: %s" % (self.client_address[0], packet))
# just send back the same data, but upper-cased
self.request.sendall(bytes('{ok: 1, msg:""}', 'utf-8'))
if __name__ == "__main__":
HOST, PORT = "0.0.0.0", 9999
# Create the server, binding to localhost on port 9999
server = socketserver.TCPServer((HOST, PORT), TCPServerHandler)
# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
server.serve_forever()