執行緒的核心特徵就是他們能夠以非確定的方式(即何時開始執行,何時被打斷,何時恢復完全由作業系統來排程管理,這是使用者和程式設計師無法確定的)獨立執行的,如果程式中有其他執行緒需要判斷某個執行緒是否已經到達執行過程中的某個點,根據這個判斷來執行後續的操作,那麼這就產生了非常棘手的執行緒同步問題,要解決這個問題,我們可以使用threading庫中的event物件。
event物件和條件標記類似,允許執行緒等待某個事件發生。初始狀態時事件被設定為0,如果事件沒有被設定而執行緒正在等待該事件,,那麼執行緒就會被阻塞,直到事件被設定為止.當有執行緒設定了這個事件時,就會喚醒所有正在等待該事件的執行緒,如果執行緒等待的事件已經設定了,那麼執行緒會繼續執行
下面給出了乙個簡單的示例,使用event來同步執行緒的啟動
#!/usr/bin/env python
from threading import thread,event
import time
def countdown(n,started_evt):
print 'countdown starting'
started_evt.set()
while n>0:
print n
n-=1
time.sleep(5)
started_evt=event()
print 'launching countdown'
t=thread(target=countdown,args=(3,started_evt))
t.start()
started_evt.wait()
print 'countdown is running'
當執行這段**的時候,字串'countdown is running'總是會在『countdown starting』之後顯示,這裡使用了事件來同步執行緒,使得主線程等待,直到countdown()函式首先列印啟動資訊之後採開始執行
vent物件實現了簡單的執行緒通訊機制,它提供了設定訊號,清楚訊號,等待等用於實現執行緒間的通訊。
1 設定訊號
使用event的set()方法可以設定event物件內部的訊號標誌為真。event物件提供了isset()方法來判斷其內部訊號標誌的狀態。當使用event物件的set()方法後,isset()方法返回真
2 清除訊號
使用event物件的clear()方法可以清除event物件內部的訊號標誌,即將其設為假,當使用event的clear方法後,isset()方法返回假
3 等待
event物件wait的方法只有在內部訊號為真的時候才會很快的執行並完成返回。當event物件的內部訊號標誌位假時,則wait方法一直等待到其為真時才返回。
#!/usr/bin/env python
import threading
import time
class mythread(threading.thread):
def __init__(self,signal):
threading.thread.__init__(self)
self.signal=signal
def run(self):
print "i am %s,i will sleep.."%self.name
self.signal.wait()
print "i am %s,i awake.."%self.name
if __name__=='__main__':
signal=threading.event()
for t in range(0,3):
thread=mythread(signal)
thread.start()
print "main thread sleep 3 seconds..."
time.sleep(1)
signal.set()
root@hanfeifei-hp-prodesk-680-g2-mt:/mnt/han# python event1.py
i am thread-1,i will sleep..
i am thread-2,i will sleep..
i am thread-3,i will sleep..
main thread sleep 3 seconds...
i am thread-3,i awake..
i am thread-2,i awake..
i am thread-1,i awake..
event內部包含了乙個標誌位,初始的時候為false。
可以使用使用set()來將其設定為true;
或者使用clear()將其從新設定為false;
可以使用is_set()來檢查標誌位的狀態;
另乙個最重要的函式就是wait(timeout=none),用來阻塞當前執行緒,直到event的內部標誌位被設定為true或者timeout超時。如果內部標誌位為true則wait()函式理解返回。
多執行緒的同步機制
1 event 用事件 event 來同步執行緒是最具彈性的了。乙個事件有兩種狀態 激發狀態和未激發狀態。也稱有訊號狀態和無訊號狀態。事件又分兩種型別 手動重置事件和自動重置事件。手動重置事件被設定為激發狀態後,會喚醒所有等待的執行緒,而且一直保持為激發狀態,直到程式重新把它設定為未激發狀態。自動重...
執行緒同步機制
本週主要學習 執行緒同步機制 互斥量 讀寫鎖和條件變數 和簡單程式的實現,對執行緒同步有了進一步認識 內容如下 執行緒的基本概念,相關函式 互斥量 說明 處於標圓形框之上的線段表示相關的執行緒沒有擁有互斥量 處於圓形框中心線之上的線段表示相關的執行緒等待互斥量 處於圓形框中心線之下的線段表示相關的執...
執行緒同步機制
執行緒同步主要用於協調對臨界資源的訪問,臨界資源可以是硬體裝置 比如印表機 磁碟 檔案 記憶體 變數 陣列 佇列等 執行緒同步有4種機制 他們的主要區別在於 各同步機制詳細的功能說明如下 臨界區臨界區是一段獨佔對某些共享資源訪問的 在任意時刻只允許乙個執行緒對共享資源進行訪問。如果有多個執行緒試圖同...