PyQt SimpleHTTPServer:GUI 在启动服务器时冻结

rak*_*h93 5 python multithreading pyqt multiprocessing simplehttpserver

我正在尝试使用 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()`
Run Code Online (Sandbox Code Playgroud)

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

def btn_startserver_clicked(self):
    if __name__=='__main__':
        server_process=Process(target=start_server())
        server_process.start()
Run Code Online (Sandbox Code Playgroud)

有没有办法解决?我觉得使用多处理是正确的方法,但我对此很陌生,无法弄清楚为什么它仍然冻结。

谢谢

thr*_*les 2

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

server_thread=threading.Thread(target=start_server)
Run Code Online (Sandbox Code Playgroud)

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

最后的建议是,您应该真正存储创建的线程,以self.server_thread防止它被垃圾收集。