python - 列表中的多线程停止 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
解决方案
我现在拥有的一个临时解决方案是我正在运行一个 thead 侦听器。每个线程都向侦听器发布“运行”,并且该线程为线程数量保留一个整数。在线程(wx.callafter)结束时,发布“完成”并且整数再次减少。因此,当整数为 0 时,这意味着所有线程都已完成,我可以继续处理例如数据库的内容。但是,这似乎不是检查线程是否完成的真正有效方法。但问题依然存在。“join()”正在冻结……如果我设置了一个 while 循环,我基本上会创建与 join() 语句相同的情况……它会冻结应用程序。所以任何关于如何更有效地执行此操作的建议欢迎!
谢谢!
推荐阅读
- angular - Angular 自定义元素和语义标签
- nginx - 用于处理问号的 nginx 正则表达式
- intellij-idea - 如何让 IntelliJ 将 .config 文件视为 XML 文件
- webpack - Webpack babel 构建在箭头函数解析上失败
- javascript - 如何使用一个数组过滤对象数组并创建另一个数组?- Javascript
- php - ftp_put(): 无法创建文件
- android - 如何在 XML 中对矢量的 strokeColor 和 fillColor 进行淡化/动画处理?
- delphi - Delphi TWebBrowser 连接到本地设备失败
- c# - 使用 volatile bool 创建一个不可重入的“非暂停”定时器
- python - 在 OCR 的行、单词和字符分割中使用查找轮廓