如何调节“ for”循环中的线程?

时间:2019-10-15 21:17:20

标签: python parallel-processing python-multithreading

我有以下问题: 我正在使用线程运行一个大型过程,其中涉及导入一对文件,计算并返回分数。这一切都在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可以对其进行调节,但是它们所做的只是冻结程序。

关于我应该使用什么的任何建议?

1 个答案:

答案 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