首页 > 解决方案 > 列表中的多线程停止 main

问题描述

我正在开发一个计算机检查程序,有几项检查。一旦检查完成,结果将进入数据库。到目前为止,一切都很好。由于单独的函数冻结了应用程序(基于 wx),我在代码中引入了线程。哪个工作又好又快。线程看起来像这样:

   check2 = thread2()
   check3 = thread3()
   check3 = thread4()
   check4 = thread5()

   check1.start()
   check2.start()
   check3.start()
   check4.start()
   check5.start()

以上是一个定义,由按钮按下事件启动。这一切都很好。现在我必须将结果上传到数据库中。当我在代码之后添加函数,例如uploadDB(arg[]) 时,虽然线程仍然很忙,但函数将启动。

这意味着我必须等到完成。因此,我现在使用的代码有点不同,例如:

threads=[]
c1 = check1()
threads.append(c1)
c2 = check2()
threads.append(c2)
...
for x in threads:
   x.start()
        
# wait for all threads to finish
for x in threads:
   x.join()

uploadDB(arg[])

这也可以,但是在连接过程中,界面再次冻结,因为一切都在等待线程完成……而冻结实际上是我不想要的……但是如果我不使用连接...我不知道在上传之前线程何时完成..我想应该有一个更简单的方法来做到这一点?

再次感谢您的帮助!~ /Jasper

标签: pythonpython-3.xmultithreadingpython-multithreading

解决方案


我现在拥有的一个临时解决方案是我正在运行一个 thead 侦听器。每个线程都向侦听器发布“运行”,并且该线程为线程数量保留一个整数。在线程(wx.callafter)结束时,发布“完成”并且整数再次减少。因此,当整数为 0 时,这意味着所有线程都已完成,我可以继续处理例如数据库的内容。但是,这似乎不是检查线程是否完成的真正有效方法。但问题依然存在。“join()”正在冻结……如果我设置了一个 while 循环,我基本上会创建与 join() 语句相同的情况……它会冻结应用程序。所以任何关于如何更有效地执行此操作的建议欢迎!

谢谢!


推荐阅读