天天看點

Python标準庫08 多線程與同步 (threading包)

作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!

我們使用了兩個全局變量,一個是i,用以儲存剩餘票數;一個是lock對象,用于同步線程對i的修改。此外,在最後的for循環中,我們總共設定了10個線程。每個線程都執行booth()函數。線程在調用start()方法的時候正式啟動 (實際上,計算機中最多會有11個線程,因為主程式本身也會占用一個線程)。Python使用threading.Thread對象來代表線程,用threading.Lock對象來代表一個互斥鎖 (mutex)。

有兩點需要注意:

我們在booth中使用了兩個doChore()函數。可以在未來改程序式,以便讓線程除了進行i=i-1之外,做更多的操作,比如列印剩餘票數,找錢,或者喝口水之類的。第一個doChore()依然在Lock内部,是以可以安全地使用共享資源 (critical operations, 比如列印剩餘票數)。第二個doChore()時,Lock已經被釋放,是以不能再去使用共享資源。這時候可以做一些不使用共享資源的操作 (non-critical operation, 比如找錢、喝水)。我故意讓doChore()等待了0.5秒,以代表這些額外的操作可能花費的時間。你可以定義的函數來代替doChore()。

上面OOP程式設計方法與面向過程的程式設計方法相比,并沒有帶來太大實質性的差别。

threading.Thread對象: 我們已經介紹了該對象的start()和run(), 此外:

join()方法,調用該方法的線程将等待直到改Thread對象完成,再恢複運作。這與程序間調用wait()函數相類似。

threading.Lock對象: mutex, 有acquire()和release()方法。

threading.Condition對象: condition variable,建立該對象時,會包含一個Lock對象 (因為condition variable總是和mutex一起使用)。可以對Condition對象調用acquire()和release()方法,以控制潛在的Lock對象。此外:

wait()方法,相當于cond_wait()

notify_all(),相當與cond_broadcast()

nofify(),與notify_all()功能類似,但隻喚醒一個等待的線程,而不是全部

<dl></dl>

<dt>threading.Event對象: 與threading.Condition相類似,相當于沒有潛在的Lock保護的condition variable。對象有True和False兩個狀态。可以多個線程使用wait()等待,直到某個線程調用該對象的set()方法,将對象設定為True。線程可以調用對象的clear()方法來重置對象為False狀态。</dt>

<dt> </dt>

<dt></dt>

<dt>練習</dt>

<dt>更多的threading的内容請參考:</dt>

<a href="http://docs.python.org/library/threading.html">http://docs.python.org/library/threading.html</a>

threading.Thread

Lock, Condition, Semaphore, Event