u012062929 2021-04-12 20:11 采纳率: 0%
浏览 75

在python3中,如何做到通过两个按钮来开启/关闭 httpServer?

如图,这是我定义的http服务类,并写了一个start函数和shutdown函数,但是通过按钮事件访问start函数的时候,由于server.serve_forever()函数循环的问题导致程序未响应,没有办法点击另一个按钮

我也试过多线程的方式处理,但是server对象没办法在两个函数之间共享,请问有什么解决办法吗,还是说我思路不对(本人python新手)

  • 写回答

1条回答 默认 最新

  • chriswu1031 2023-05-31 10:14
    关注

    您可以使用多线程或多进程来处理HTTP服务器和按钮事件之间的并发性问题。您可以将HTTP服务器的运行放在一个线程或进程中,并将按钮事件处理放在另一个线程或进程中。
    以下是一个示例,展示了如何使用多线程来处理HTTP服务器和按钮事件:

    import threading
    from http.server import HTTPServer
    
    class RequestHandler(BaseHTTPRequestHandler):
        def do_POST(self):
            content_length = int(self.headers['Content-Length'])
            post_data = self.rfile.read(content_length)
            print("POST request, InPath: {}, Headers: {}, Body: {}".format(
                str(self.path), str(self.headers), post_data.decode("utf-8")))
            res = "You Input: " + post_data.decode("utf-8")
            self.do_HEAD()
            self.wfile.write("{}".format(res).encode('utf-8'))
    
        def do_HEAD(self):
            self.send_response(200)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
    
    class MyHTTPServer(HTTPServer):
        def __init__(self, host, port):
            super().__init__((host, port), RequestHandler)
    
        def run(self):
            self.serve_forever()
    
    def start_http_server():
        http_server = MyHTTPServer('localhost', 8000)
        http_server.run()
    
    def handle_button_event():
        # 处理按钮事件的代码
        pass
    
    def start_server_and_handle_button():
        server_thread = threading.Thread(target=start_http_server)
        server_thread.start()
    
        handle_button_event()
    
    start_server_and_handle_button()
    

    在上面的代码中,start_http_server函数创建了一个自定义的MyHTTPServer对象,并在一个单独的线程中调用run方法来启动服务器。
    handle_button_event函数是您处理按钮事件的代码。您可以在这个函数中实现您的按钮逻辑。
    最后,start_server_and_handle_button函数启动了HTTP服务器线程和按钮事件处理,它们可以并发运行。
    请注意,这只是一个简单示例,以帮助您理解如何在多线程环境中处理HTTP服务器和按钮事件。实际应用可能需要更复杂的线程同步和管理。另外,如果您的应用程序需要更高级的并发性和可扩展性,您可能需要考虑使用异步编程库,如asyncio或aiohttp。

    评论

报告相同问题?

悬赏问题

  • ¥200 基于同花顺supermind的量化策略脚本编辑
  • ¥20 Html备忘录页面制作
  • ¥15 黄永刚的晶体塑性子程序中输入的材料参数里的晶体取向参数是什么形式的?
  • ¥20 数学建模来解决我这个问题
  • ¥15 计算机网络ip分片偏移量计算头部是-20还是-40呀
  • ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
  • ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度
  • ¥15 求micropython modbus-RTU 从机的代码或库?