Skip to main content
 首页 » 编程设计

python之PyQt 简单 HTTP 服务器 : GUI freezes on starting server

2024年10月25日28over140

我正在尝试使用 PyQt 创建一个简单的桌面应用程序,该应用程序在单击启动服务器按钮时运行 SimpleHTTPServer。我尝试过使用线程(python 线程和 Qthread)并理解这是不可能的,因为它遇到了 GIL 问题。这是代码

def btn_startserver_clicked(self): 
    server_thread=threading.Thread(target=start_server()) 
    server_thread.start() 
 
 
def start_server(): 
    #to get server's IP 
    host=([(s.connect(('8.8.8.8', 80)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]) 
    start=8000 
    end=56999 
    PORT = random.randint(start,end) 
    print host,":",PORT 
    httpd=ThreadedServer(("",PORT), SimpleHTTPServer.SimpleHTTPRequestHandler) 
    httpd.handle_request()` 

我尝试创建另一个进程,但同样的事情发生了。此外,如果我创建另一个进程,则每次处理请求时都会弹出一个新窗口。

def btn_startserver_clicked(self): 
    if __name__=='__main__': 
        server_process=Process(target=start_server()) 
        server_process.start() 

有什么办法解决这个问题吗?我觉得使用多处理是正确的方法,但我是新手,无法弄清楚为什么它仍然卡住。

谢谢

请您参考如下方法:

锁定 GUI 的示例的问题在于,您不是在创建线程时传递对函数的引用,而是实际上立即运行该函数并且永远不会创建线程。例如,您应该这样做:

server_thread=threading.Thread(target=start_server) 

请注意,我将括号放在 start_server 上,否则代码会等待 start_server() 完成执行,然后再创建 threading.Thread 对象,并使用 start_server() 的返回值作为 target 属性的值。

最后一个建议,你真的应该将创建的线程存储为 self.server_thread 以防止它被垃圾收集。