欢迎访问宙启技术站
智能推送

Python多线程中主线程等待所有子线程结束的方法

发布时间:2023-05-16 09:51:05

Python是一种简单易学、可拓展性强的编程语言,它提供了多线程编程的支持。多线程编程允许程序同时执行多个线程,在程序中实现并发的操作,以提高程序的效率。在多线程编程中,主线程必须等待所有子线程结束之后再结束。否则,子线程可能会在主线程结束之前独立运行。下面讲一下Python多线程中主线程等待所有子线程结束的方法。

Python多线程中有两种常见的方法来实现主线程等待所有子线程结束。

方法一:使用join()方法

join()方法是Python多线程中等待子线程完成的最简单的方法。

调用子线程的join()方法会使主线程被阻塞,直到子线程完成。join()方法有两种调用方式:

1. join()

调用子线程的join()方法时,主线程将被阻塞,直到子线程完成。

例如:

import threading
import time

def run():
    print('子线程开始')
    time.sleep(2)
    print('子线程结束')

t = threading.Thread(target=run)
t.start()

t.join()

print('主线程结束')

输出结果:

子线程开始
子线程结束
主线程结束

2. join(timeout)

调用子线程的join(timeout)方法时,主线程将被阻塞,直到子线程完成或超时。如果子线程在超时之前完成,则join()方法返回True。如果超时时间到达但子线程尚未完成,则join()方法返回False。

例如:

import threading
import time

def run():
    print('子线程开始')
    time.sleep(1)
    print('子线程结束')

t = threading.Thread(target=run)
t.start()

if t.join(2):
    print('子线程完成')
else:
    print('子线程未完成')

print('主线程结束')

输出结果:

子线程开始
子线程结束
子线程完成
主线程结束

方法二:使用线程池

线程池是一种用于管理多个线程的技术。在Python中,可以通过ThreadPoolExecutor类来创建一个线程池。

实现主线程等待所有子线程结束的方法是:

1. 创建ThreadPoolExecutor对象时,指定线程池中最大的线程数。

2. 使用submit()方法向线程池中添加线程。

3. 调用shutdown()方法,等待所有线程完成。

例如:

import concurrent.futures
import time

def run():
    print('子线程开始')
    time.sleep(2)
    print('子线程结束')

executor = concurrent.futures.ThreadPoolExecutor(max_workers=2)

futures = []
for i in range(2):
    futures.append(executor.submit(run))

concurrent.futures.wait(futures)

print('主线程结束')

输出结果:

子线程开始
子线程开始
子线程结束
子线程结束
主线程结束

以上就是Python多线程中主线程等待所有子线程结束的两种方法。无论使用哪种方法,主线程必须等待所有子线程结束,才能保证程序正确地执行。