Python - 联接线程



在 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)

# Create thread objects
thread1 = Thread(target=my_function_1, args=(5,))
thread2 = Thread(target=my_function_2, args=(3,))

# Start the first thread and wait for it to complete
thread1.start()
thread1.join()

# Start the second thread and wait for it to complete
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)

# Create thread objects
thread1 = Thread(target=my_function_1, args=(5,))
thread2 = Thread(target=my_function_2, args=(3,))

# Start the first thread and wait for 0.2 seconds
thread1.start()
thread1.join(timeout=0.2)

# Start the second thread and wait for it to complete
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