Python 3.x Python3将队列传递给多线程HTTP服务器类
我将是第一个承认我对Python还比较陌生的人。这个董事会帮了很多忙 我正在从事一个项目,在这个项目中,我使用一个多线程HTTP服务器,我需要向主循环发送一个信号。我试图以此为基础: 以下是我目前在Python 3.4中所做工作的摘录:Python 3.x Python3将队列传递给多线程HTTP服务器类,python-3.x,queue,basehttprequesthandler,Python 3.x,Queue,Basehttprequesthandler,我将是第一个承认我对Python还比较陌生的人。这个董事会帮了很多忙 我正在从事一个项目,在这个项目中,我使用一个多线程HTTP服务器,我需要向主循环发送一个信号。我试图以此为基础: 以下是我目前在Python 3.4中所做工作的摘录: if __name__ == '__main__': ... q1 = Queue(maxsize=0) ... remote_http_thread = threading.Thread(target=remote_threa
if __name__ == '__main__':
...
q1 = Queue(maxsize=0)
...
remote_http_thread = threading.Thread(target=remote_threader, args=(q1))
remote_http_thread.daemon = True
remote_http_thread.start()
...
while 1:
time.sleep(1)
try:
my_message = q1.get_nowait()
message_flag = 1
print("GOT THE FOLLOWING QUEUE MESSAGE :", my_message)
except:
message flag = 0
...
以下内容位于不同的文件my HTTP server代码中:
def remote_threader(qit):
remote_Server = ThreadedHTTPServer(("", 35677), P_Server)
remote_Server.qu = qit
remote_Server.serve_forever()
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
"""Handle requests in a separate thread."""
class P_Server(BaseHTTPRequestHandler):
def __init__(self, request, client_address, server):
BaseHTTPRequestHandler.__init__(self, request, client_address, server)
self.qu = server.qu # save the queue here.
def go_GET(self):
...
# We have an event that we want to signal back to the main loop
self.qu.put("Event")
HTTP服务器工作正常,我现在正试图将消息传递回主循环,以便某些事件导致事件发生。运行上述代码会导致一个异常,即P_服务器没有“qu”属性
从测试中可以看出,我在init步骤中创建的任何属性(即使是硬编码的数字或字符串)在do_GET部分中都不可用
有人能告诉我这里做错了什么,我可以更改它,以便主节将消息放入HTTP服务器类的队列中吗?在调用之前尝试设置属性
BaseHTTPRequestHandler.__init__()
所以代码变成了
def remote_threader(qit):
remote_Server = ThreadedHTTPServer(("", 35677), P_Server)
remote_Server.qu = qit
remote_Server.serve_forever()
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
"""Handle requests in a separate thread."""
class P_Server(BaseHTTPRequestHandler):
def __init__(self, request, client_address, server):
# THE ATTRIBUTE IS SET HERE
self.qu = server.qu # save the queue here.
# super's init called after setting attribute
BaseHTTPRequestHandler.__init__(self, request, client_address, server)
def go_GET(self):
...
# Accessed in GET
self.qu.put("Event")
当我在调用BaseHttpRequestHandler的init之前设置属性时,它对我起到了作用