如何等待所有线程完成它们的工作?

3
我有以下脚本(不要参考内容):
import _thread

def func1(arg1, arg2):
    print("Write to CLI")

def verify_result():
    func1()


for _ in range (4):
    _thread.start_new_thread(func1, (DUT1_CLI, '0'))

verify_result()

我希望可以同时执行(如4个线程)func1()函数,但在我的情况下该函数调用可能需要时间来执行。然后,在最后一个线程完成工作之后,我想执行verify_result()函数。

当前,我得到的结果是所有线程都完成了它们的工作,但verify_result()函数在所有线程完成工作之前就被执行了。

我甚至尝试在for循环中使用以下代码(当然我导入了线程模块),但这并没有起作用(不要参考参数)。

t = threading.Thread(target = Enable_WatchDog, args = (URL_List[x], 180, Terminal_List[x], '0'))
t.start()
t.join()
2个回答

5

您上一篇有关 threading 的示例接近正确,但需要将线程收集到一个列表中,一次性启动所有线程,然后等待所有线程一起完成。以下是一个简化的示例:

import threading
import time

# Lock to serialize console output
output = threading.Lock()

def threadfunc(a,b):
    for i in range(a,b):
        time.sleep(.01) # sleep to make the "work" take longer
        with output:
            print(i)

# Collect the threads
threads = []
for i in range(10,100,10):
    # Create 9 threads counting 10-19, 20-29, ... 90-99.
    thread = threading.Thread(target=threadfunc,args=(i,i+10))
    threads.append(thread)

# Start them all
for thread in threads:
    thread.start()

# Wait for all to complete
for thread in threads:
    thread.join()

2

假设你有一个线程列表。

你通过循环(each_thread)遍历它们 -

for each_thread in thread_pool:
    each_thread.start()

在循环内部启动每个线程的运行函数。

同样地,您可以在启动所有线程并拥有它们之后编写另一个循环来执行其他操作

for each_thread in thread_pool:
    each_thread.join()

join()的作用是在让i+1个线程完成执行之前,等待线程i完成执行。

线程将并发运行,join()只会同步每个线程返回其结果的方式。

特别地,在您的情况下,您可以使用join()循环和运行verify_result()函数。


我对Python和线程编程都比较陌生。您能否请详细解释一下什么是线程池?我该如何准备线程列表呢? - Moshe S.
@MosheS。通过线程池,我指的是一个字面上的线程集合。假设您有一个需要执行5次并且最好是并发执行的作业,您恰好为此创建(而不是开始执行)了2个线程,现在每个线程将占用一个作业,3个作业将等待直到一个线程空闲以接受它们,因此请检查线程池是否有空闲的线程可以这样做,否则等待,直到有空闲的线程。通过线程列表,我指的是线程对象的列表。您可以对它们进行迭代并启动作业,这就是我认为您想要做的事情。在我的答案中,thread_pool指的是这样的列表,而不是线程池。 - rohit keshav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接