Python - 线程的join操作



在Python中,线程的join操作是指使用join()方法等待一个线程完成,然后再继续执行其他线程。这在多线程编程中非常有用,可以确保某些线程在启动或继续其他线程之前完成。通过使用join()方法,您可以确保一个线程在另一个线程或主程序继续执行之前已完成运行。本教程将结合合适的示例,详细解释join()方法。

Python中的线程join操作

要在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
广告