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
廣告