[本文出自天外歸雲的博客園]
一個多線程的題:定義三個線程ID分別為ABC,每個線程打印10遍自己的線程ID,按ABCABC……的順序進行打印輸出。
我的解法:
from threading import Thread, Lock # 由_acquire解鎖執行后釋放_release鎖 def _print(_id: str, _acquire: Lock, _release: Lock) -> None: for i in range(10): _acquire.acquire() print(f"id:{_id}") _release.release() if __name__ == '__main__': # 創建三個鎖供3個線程使用 mutex1 = Lock() mutex2 = Lock() mutex3 = Lock() # 定義三個線程A、B、C # 線程A需要mutex1解鎖執行后釋放mutex2 # 線程B需要mutex2解鎖執行后釋放mutex3 # 線程C需要mutex3解鎖執行后釋放mutex1 # 元組中第一位是自定義的線程ID,第二位是解鎖需要的鎖,第三位是釋放的鎖 threads = [Thread(target=_print, args=[i[0], i[1], i[2]]) for i in [('A', mutex1, mutex2), ('B', mutex2, mutex3), ('C', mutex3, mutex1)]] # 把mutex2和mutex3這兩把鎖先用了以便阻塞線程2和線程3的執行 mutex2.acquire() mutex3.acquire() # 接下來只有線程A可以先執行是因為mutex1並沒有被占用 # 線程B和線程C需要分別等待着鎖2和鎖3的釋放才能繼續執行 [thr.start() for thr in threads] [thr.join() for thr in threads]