在 Python 中合并线程意味着使用 join()
方法来等待一个线程完成其执行再继续其他线程的操作。这在多线程编程中有用,可以确保某些线程在开始或继续其他线程之前已完成。通过使用 join()
方法,你可以确保一个线程已经运行完毕然后再让另一个线程或主程序继续执行。在本教程中,你将获得关于 join()
方法的详细解释以及合适的示例。
在 Python 中合并线程
要在 Python 中合并线程,你可以使用来自 threading
模块的 Thread.join()
方法。该方法通常用于阻止调用线程,直到 join()
被调用的那个线程终止。终止可能是正常的,因为未处理的异常,或者直到可选的超时发生。你可以多次调用 join()
。然而,如果你尝试合并当前线程或者试图在没有用 start()
方法启动线程之前就合并它,将会引发 RuntimeError
异常。
Thread.join()
方法的语法如下:
thread.join(timeout)
其中 timeout
是一个可选参数,接受一个表示最大等待时间(秒或其分数)的浮点数。如果没有提供或为 None
,则该方法会阻塞直到线程终止。
此方法总是返回 None
。调用 join()
之后,你可以使用 is_alive()
来检查线程是否仍在运行。这对于确定 join()
调用是否超时很有用。
示例
下面的示例演示了在一个多线程程序中使用 join()
。它启动了两个线程(thread1
和 thread2
)。最初,它阻止主线程直到 thread1
执行完 my_function_1
。在 thread1
完成后,调用 thread2.start()
,接着是 thread2.join()
以确保主线程等待 thread2
完成 my_function_2()
的执行。
from threading import Thread
from time import sleep
def my_function_1(arg):
for i in range(arg):
print("Child Thread 1 running", i)
sleep(0.5)
def my_function_2(arg):
for i in range(arg):
print("Child Thread 2 running", i)
sleep(0.1)
thread1 = Thread(target=my_function_1, args=(5,))
thread2 = Thread(target=my_function_2, args=(3,))
thread1.start()
thread1.join()
thread2.start()
thread2.join()
print("Main thread finished...exiting")
执行上述代码后,将会产生如下结果:
Child Thread 1 running 0
Child Thread 1 running 1
Child Thread 1 running 2
Child Thread 1 running 3
Child Thread 1 running 4
Child Thread 2 running 0
Child Thread 2 running 1
Child Thread 2 running 2
Main thread finished...exiting
示例
下面是一个另一个示例,展示了带有超时的 join()
方法允许等待指定的时间段以让线程完成,即使线程尚未完成也会继续执行。
from threading import Thread
from time import sleep
def my_function_1(arg):
for i in range(arg):
print("Child Thread 1 running", i)
sleep(0.5)
def my_function_2(arg):
for i in range(arg):
print("Child Thread 2 running", i)
sleep(0.1)
thread1 = Thread(target=my_function_1, args=(5,))
thread2 = Thread(target=my_function_2, args=(3,))
thread1.start()
thread1.join(timeout=0.2)
thread2.start()
thread2.join()
print("Main thread finished...exiting")
当你运行上述代码时,可以看到如下输出:
Child Thread 1 running 0
Child Thread 2 running 0
Child Thread 2 running 1
Child Thread 2 running 2
Child Thread 1 running 1
Main thread finished...exiting
Child Thread 1 running 2
Child Thread 1 running 3
Child Thread 1 running 4