Python - 執行緒生命週期



執行緒物件在其生命週期中會經歷不同的階段。當建立一個新的執行緒物件時,必須啟動它,這會呼叫執行緒類的 run() 方法。此方法包含新執行緒要執行的過程的邏輯。當 run() 方法結束時,執行緒完成其任務,並且新建立的執行緒與主執行緒合併。

線上程執行時,它可能會暫停預定義的持續時間,或者可以要求它暫停直到某個事件發生。在指定的時間間隔或程序結束後,執行緒恢復。

thread_life_cycle

Python 執行緒生命週期中的狀態

以下是 Python 執行緒生命週期的階段:

  • 建立執行緒 − 要在 Python 中建立新執行緒,通常使用 threading 模組中的 Thread 類。
  • 啟動執行緒 − 建立執行緒物件後,必須透過呼叫其 start() 方法來啟動它。這會啟動執行緒的活動並在執行緒中呼叫其 run() 方法。
  • 暫停/阻塞狀態 − 執行緒可能由於各種原因而暫停或阻塞,例如等待 I/O 操作完成或另一個執行緒執行任務。這通常透過呼叫其 join() 方法來管理。這會阻塞呼叫執行緒,直到要連線的執行緒終止。
  • 執行緒同步 − 同步確保執行緒之間以有序的方式執行和共享資源管理。這可以透過使用同步原語(如鎖、訊號量或條件變數)來完成。
  • 終止 − 當執行緒的 run() 方法完成執行時,執行緒終止,無論是完成其任務還是遇到異常。

示例:Python 執行緒生命週期演示

此示例透過顯示執行緒建立、啟動、執行以及與主執行緒的同步來演示 Python 中的執行緒生命週期。

import threading

def func(x):
   print('Current Thread Details:', threading.current_thread())
   for n in range(x):
      print('{} Running'.format(threading.current_thread().name), n)
   print('Internal Thread Finished...')

# Create thread objects
t1 = threading.Thread(target=func, args=(2,))
t2 = threading.Thread(target=func, args=(3,))

# Start the threads
print('Thread State: CREATED')
t1.start()
t2.start()

# Wait for threads to complete
t1.join()
t2.join()
print('Threads State: FINISHED')

# Simulate main thread work
for i in range(3):
   print('Main Thread Running', i)

print("Main Thread Finished...")

輸出

執行上述程式碼時,會產生以下輸出:

Thread State: CREATED
Current Thread Details: <Thread(Thread-1 (func), started 140051032258112)>
Thread-1 (func) Running 0
Thread-1 (func) Running 1
Internal Thread Finished...
Current Thread Details: <Thread(Thread-2 (func), started 140051023865408)>
Thread-2 (func) Running 0
Thread-2 (func) Running 1
Thread-2 (func) Running 2
Internal Thread Finished...
Threads State: FINISHED
Main Thread Running 0
Main Thread Running 1
Main Thread Running 2
Main Thread Finished...

示例:使用同步原語

這是另一個示例,演示了 Python 中的執行緒生命週期,包括建立、啟動、執行和終止狀態,以及使用訊號量的同步。

import threading
import time

# Create a semaphore 
semaphore = threading.Semaphore(2)

def worker():
   with semaphore:
      print('{} has started working'.format(threading.current_thread().name))
      time.sleep(2)
      print('{} has finished working'.format(threading.current_thread().name))

# Create a list to keep track of thread objects
threads = []

# Create and start 5 threads
for i in range(5):
   t = threading.Thread(target=worker, name='Thread-{}'.format(i+1))
   threads.append(t)
   print('{} has been created'.format(t.name))
   t.start()

# Wait for all threads to complete
for t in threads:
   t.join()
   print('{} has terminated'.format(t.name))

print('Threads State: All are FINISHED')
print("Main Thread Finished...")

輸出

執行上述程式碼時,會產生以下輸出:

Thread-1 has been created
Thread-1 has started working
Thread-2 has been created
Thread-2 has started working
Thread-3 has been created
Thread-4 has been created
Thread-5 has been created
Thread-1 has finished working
Thread-2 has finished working
Thread-3 has started working
Thread-1 has terminated
Thread-2 has terminated
Thread-4 has started working
Thread-3 has finished working
Thread-5 has started working
Thread-3 has terminated
Thread-4 has finished working
Thread-4 has terminated
Thread-5 has finished working
Thread-5 has terminated
Threads State: All are FINISHED
Main Thread Finished...
廣告