【问题标题】:Python3 passing a queue to a multi-threaded HTTP server classPython3将队列传递给多线程HTTP服务器类
【发布时间】:2017-05-21 06:06:57
【问题描述】:

我将是第一个承认我对 Python 还是比较陌生的人。这个板子帮了大忙……

我正在开发一个使用多线程 HTTP 服务器的项目,我需要将信号发送回主循环。我试图以此为基础:Passing a Queue to ThreadedHTTPServer

这是我目前正在做的事情的摘录(在 Python 3.4 中):

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
        ...

以下在不同的文件中(我的 HTTP 服务器代码):

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_Server 没有属性 'qu' 的异常

从测试看来,我在 init 步骤中创建的任何属性(甚至是硬编码的数字或字符串)在“do_GET”部分中都不可用。

谁能让我知道我在这里做错了什么,我可以更改它,以便主要部分将消息放入 HTTP 服务器类的队列中?

【问题讨论】:

    标签: python-3.x queue basehttprequesthandler


    【解决方案1】:

    尝试在调用前设置属性

    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 之前设置属性时为我工作

    【讨论】:

      猜你喜欢
      • 2021-07-08
      • 2019-01-20
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多