每当我使用 xxx.join() 时它都不起作用

问题描述 投票:0回答:1

每当我使用 xxx.join() 时,它都不会起作用,eitehr 只是停止并且不继续执行其余代码或使我的程序崩溃。在这种情况下使我的程序崩溃。我通常不需要它,但对于我当前的程序,我试图允许客户端等待来自服务器的消息,并且我需要 .join() 来允许这一点而不会崩溃。 new_message 只会使我的程序崩溃,并且不允许形成新的 GUI。 终端中没有出现错误,只是崩溃

        def email_verify_gui():
            # new gui
            email_entry.destroy()
            username_entry.destroy()
            createpassword_entry.destroy()
            confirmpassword_entry.destroy()
            invalid_passwords.destroy()
            invalid_boxes.destroy()
            next_button.destroy()

            S2.configure(text="Verify your email.")
            img2 = customtkinter.CTkImage(dark_image=Image.open("emailverify2.png"), size=(250, 175))
            subtitle = customtkinter.CTkLabel(master=frame_signup, text=("Complete the tab we opened "
                                                                         "so that we can verify your email."),
                                              text_color="#fff", font=("Century Gothic", 16), wraplength=300)
            subtitle.place(x=27, y=90)
            email_img = customtkinter.CTkLabel(master=frame_signup, image=img2, text="")
            email_img.place(x=35, y=130)

        def server_email():
            server_email_status = False
            client.send(("send email").encode())
            client.send(new_email.encode())
            print(new_email)
            file_path = "C:\\Users\\gunne\\PycharmProjects\\Playground\\email verification html.html"
            webbrowser.open(file_path, new=2)

        def new_message():
            while True:
                server_verify_message = client.recv(2048).decode()
                if server_verify_message:
                    print(server_verify_message)
                    break


        thread_email_verify_gui = threading.Thread(target=email_verify_gui)
        thread_server_email = threading.Thread(target=server_email)
        thread_new_message = threading.Thread(target=new_message)
        print("Threads Established")

        thread_email_verify_gui.start()
        #thread_email_verify_gui.join()
        print("STAGE 1")

        thread_server_email.start()
        #thread_server_email.join()
        print("STAGE 2")

无需 .join() 即可工作,但只要我使用 new_message(),我的程序仍然会崩溃

python multithreading sockets
1个回答
0
投票

您需要使用

ThreadPoolExecutor
来实现这一点,基本上它允许您在线程上添加回调。

from concurrent.futures import ThreadPoolExecutor 
def email_verify_gui():
            # new gui
            email_entry.destroy()
            username_entry.destroy()
            createpassword_entry.destroy()
            confirmpassword_entry.destroy()
            invalid_passwords.destroy()
            invalid_boxes.destroy()
            next_button.destroy()

            S2.configure(text="Verify your email.")
            img2 = customtkinter.CTkImage(dark_image=Image.open("emailverify2.png"), size=(250, 175))
            subtitle = customtkinter.CTkLabel(master=frame_signup, text=("Complete the tab we opened "
                                                                         "so that we can verify your email."),
                                              text_color="#fff", font=("Century Gothic", 16), wraplength=300)
            subtitle.place(x=27, y=90)
            email_img = customtkinter.CTkLabel(master=frame_signup, image=img2, text="")
            email_img.place(x=35, y=130)

        def server_email():
            server_email_status = False
            client.send(("send email").encode())
            client.send(new_email.encode())
            print(new_email)
            file_path = "C:\\Users\\gunne\\PycharmProjects\\Playground\\email verification html.html"
            webbrowser.open(file_path, new=2)

        def new_message():
            while True:
                server_verify_message = client.recv(2048).decode()
                if server_verify_message:
                    print(server_verify_message)
                    break

        
        executor = ThreadPoolExecutor(max_workers=3)

        future = executor.submit(email_verify_gui)
        future.add_done_callback(lambda x:server_email)
        future.add_done_callback(lambda x:new_message)
        

了解更多信息 -> https://superfastpython.com/threadpoolexecutor-in-python

© www.soinside.com 2019 - 2024. All rights reserved.