我有以下问题: 我正在使用线程运行一个大型过程,其中涉及导入一对文件,计算并返回分数。这一切都在TKinter Python API中。
对于单对,效果很好:
def run_single():
#importing , calculating and scoring
couple = [path1,path2]
th_score = threading.Thread(target= scoring_function)
th_score.start()
...
问题是当我想进行库存进口时:导入两个目录,成对使用相同的文件引用,并在循环中操作每对。我想为每个单独的迭代执行线程处理,并且仅在完成上一个计分过程中的所有线程后才从下一对文件开始。我尝试过:
def run_multiple():
for pair in couples:
couple = pair.copy()
th_score = threading.Thread(target= scoring_function)
th_score.start()
这是错误的,因为线程未同步,正在运行的某些线程正在运行中。即使当前迭代中for
的执行尚未完成(是的,我知道这是线程的目的),线程也会继续以scoring_function
循环继续。
我尝试使用条件和事件,甚至将它们用作全局变量,以便scoring_function
可以对其进行调节,但是它们所做的只是冻结程序。
关于我应该使用什么的任何建议?
答案 0 :(得分:0)
根据我的经验,执行线程的最佳方法是使用python的threading.Thread
类以及此小技巧:
import threading
couples = [1,2,3] # probably a list you created with some elements
class run_in_thread(threading.Thread):
def run(self):
for pair in couples:
couple = pair.copy()
wanted_threads = 3
for a in range(wanted_threads):
instance = run_in_thread()
instance.start()
在这种情况下,您启动了三个线程。
您可以通过线程使用内置的run()
函数。
threading.Thread
类(默认情况下)将通过稍后使用start()
执行它来创建一个新线程。
我希望这会有所帮助。
有关正确线程的更多文档,请参见:section 2.6.1