gpt4 book ai didi

Python Queue.Queue 不能在线程化的 TCP 流处理程序中工作

转载 作者:可可西里 更新时间:2023-11-01 02:39:28 29 4
gpt4 key购买 nike

我正在尝试创建一个线程化的 tcp 流处理程序类线程和主线程对话,但是 Queue.Queue 也没有做我需要的,服务器从另一个程序接收数据,我只想传递它进入主线程进行处理这里是我到目前为止的代码:

编辑:使用建议的答案进行了更新,队列仍然不执行任何操作,在我执行 self.queue.put(info) 之后,我什至无法让任何打印命令工作,就像整个事情都死了一样。然而,它没有给我任何错误,但是在我将信息放入队列后,数据进入的流处理程序/线程死亡。

class ThreadedTCPStreamHandler(SocketServer.StreamRequestHandler):

def __init__(self, request, client_address, server):
SocketServer.StreamRequestHandler.__init__(self, request, client_address, server)
self.queue = self.server.queue

def handle(self):
while True:
try:
self.data = self.rfile.readline().strip()
cur_thread = threading.current_thread()
command = self.data[0:2]
if command == "nr":
info = self.data[2:]
t1 = info.split("|")
title = t1[0]
self.queue.put(info)

class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):

def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True, queue=None):
self.queue = queue
SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate=bind_and_activate)

在主线程类中我有:

q = Queue.Queue()
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPStreamHandler, queue=q)
ip, port = server.server_address

server_thread = threading.Thread(target=server.serve_forever)
server_thread.daemon = True
server_thread.start()
while True:
try:
item = q.get()
print item
q.task_done()
q.join()
except KeyboardInterrupt:
server.shutdown()
sys.exit(0)

但是没有打印出来,也不会传递数据,我知道我做错了什么,我只是不知道它是什么。如果有人有任何见解可以提供帮助,我将不胜感激,谢谢。

最佳答案

流处理程序和主线程都需要使用相同 Queue 对象才能工作。您正在每个地方创建单独的队列对象。如果客户端和服务器代码都在同一个文件中,或者使用 queue 作为全局变量,或者这样做:

class ThreadedTCPStreamServer(ThreadingMixin, TCPServer):
def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True,
queue=None):
self.queue = queue
TCPServer.__init__(self, server_address, RequestHandlerClass,
bind_and_activate=bind_and_activate)

class ThreadedTCPStreamHandler(SocketServer.StreamRequestHandler):
def __init__(self, request, client_address, server):
self.queue = server.queue
StreamRequestHandler.__init__(self, request, client_address, server)

def handle(self):
while True:
self.data = self.rfile.readline().strip()
if not self.data:
break
cur_thread = threading.current_thread()
command = self.data[0:2]
if command == "nr":
info = self.data[2:]
t1 = info.split("|")
title = t1[0]
self.queue.put(info)
self.finish()


q = Queue.Queue()
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPStreamHandler, queue=q)
ip, port = server.server_address

server_thread = threading.Thread(target=server.serve_forever)
server_thread.daemon = True
server_thread.start()
while True:
try:
item = q.get()
print item
q.task_done()
q.join()
except KeyboardInterrupt:
server.shutdown()
sys.exit(0)

关于Python Queue.Queue 不能在线程化的 TCP 流处理程序中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25245223/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com