python實現AutoResetEvent類的阻塞模式方法解析
更新時間:2012年11月16日 11:21:43 作者:
AutoResetEvent :當某個線程執(zhí)行到WaitOne()方法時,該線程則會處于阻塞模式,當被調用了Set()方法,阻塞的線程則會繼續(xù)向下執(zhí)行,其狀態(tài)立即被自動設置為阻塞模式
搞過C#多線程的人對其中的AutoResetEvent和ManualResetEvent這兩個類都理解,其中的WaitOne()方法和Set()以及Reset()方法在線程同步當中用的是比較多的。
AutoResetEvent :當某個線程執(zhí)行到WaitOne()方法時,該線程則會處于阻塞模式,當被調用了Set()方法,阻塞的線程則會繼續(xù)向下執(zhí)行,其狀態(tài)立即被自動設置為阻塞模式。
ManualResetEvent :當某個線程執(zhí)行到WaitOne()方法時,該線程則會處于阻塞模式,當被調用了Set()方法,阻塞的線程則會繼續(xù)向下執(zhí)行,其狀態(tài)不會被自動設置為阻塞模式,必須調用其Reset()方法才會將其狀態(tài)設置為阻塞模式。
在python中threading模塊下也有一個類似的線程阻塞模式的類threading.Event(),這個類類似于C#的ManualResetEvent類,在調用set()方法后不能自動變?yōu)樽枞J健S行r候我們在開發(fā)項目當中需要這種自動的阻塞模式,我在項目當中也遇到過這種需求,就嘗試自己寫了個類似的類,吧代碼貼出來分享下,代碼不多,有不對或者是不合理的地方希望大蝦們或者是前輩們能指出,謝謝!
代碼如下:
# encoding: UTF-8
import threading
class AutoEvent:
def __init__(self):
self.event = None
self.is_wait = False # 是否處于阻塞狀態(tài)
def Wait(self,timeout=None):
if not self.is_wait:
self.is_wait = True
self.event = threading.Event() # 實例化threading.Event()對象
self.event.wait(timeout=timeout) # 調用threading.Event().wait()方法,讓線程處于阻塞狀態(tài)
del self.event # 釋放對象
def Set(self):
if not self.is_wait:raise 'must be invoke Wait() method before Set()'
self.is_wait = False
self.event.set() # 調用threading.Event().set()方法,讓線程處于繼續(xù)
下面是Demo,用來測試的:
import wx
autoEvent = AutoEvent() # 實例化MamualEvent對象
class TestDialog(wx.Dialog):
def __init__(self, parent):
wx.Dialog.__init__(self, parent, -1)
b = wx.Button(self, -1, "print", (50, 140))
self.Bind(wx.EVT_BUTTON, self.OnPrint, b)
self.thread = threading.Thread(target=self.work)
self.thread.start()
def work(self):
while True:
print 3
autoEvent.Wait() # 阻塞
def OnPrint(self, evt):
autoEvent.Set() # 繼續(xù)
if __name__=="__main__":
app = wx.App()
f = TestDialog(parent=None)
f.Show()
app.MainLoop()
當程序執(zhí)行時,首先會打印出來個 ‘3',后面沒點擊一下print按鈕,則會打印一個 '3'
測試成功。
注意:如果你將Demo代碼中的 autoEvent.Wait()和autoEvent.Set() 改成 threading.Event()類的wait()和set()方法,結果會如下:當程序執(zhí)行時,會打印個'3' ,后面點擊print按鈕后,會一直循環(huán)打印'3'
AutoResetEvent :當某個線程執(zhí)行到WaitOne()方法時,該線程則會處于阻塞模式,當被調用了Set()方法,阻塞的線程則會繼續(xù)向下執(zhí)行,其狀態(tài)立即被自動設置為阻塞模式。
ManualResetEvent :當某個線程執(zhí)行到WaitOne()方法時,該線程則會處于阻塞模式,當被調用了Set()方法,阻塞的線程則會繼續(xù)向下執(zhí)行,其狀態(tài)不會被自動設置為阻塞模式,必須調用其Reset()方法才會將其狀態(tài)設置為阻塞模式。
在python中threading模塊下也有一個類似的線程阻塞模式的類threading.Event(),這個類類似于C#的ManualResetEvent類,在調用set()方法后不能自動變?yōu)樽枞J健S行r候我們在開發(fā)項目當中需要這種自動的阻塞模式,我在項目當中也遇到過這種需求,就嘗試自己寫了個類似的類,吧代碼貼出來分享下,代碼不多,有不對或者是不合理的地方希望大蝦們或者是前輩們能指出,謝謝!
代碼如下:
復制代碼 代碼如下:
# encoding: UTF-8
import threading
class AutoEvent:
def __init__(self):
self.event = None
self.is_wait = False # 是否處于阻塞狀態(tài)
def Wait(self,timeout=None):
if not self.is_wait:
self.is_wait = True
self.event = threading.Event() # 實例化threading.Event()對象
self.event.wait(timeout=timeout) # 調用threading.Event().wait()方法,讓線程處于阻塞狀態(tài)
del self.event # 釋放對象
def Set(self):
if not self.is_wait:raise 'must be invoke Wait() method before Set()'
self.is_wait = False
self.event.set() # 調用threading.Event().set()方法,讓線程處于繼續(xù)
下面是Demo,用來測試的:
復制代碼 代碼如下:
import wx
autoEvent = AutoEvent() # 實例化MamualEvent對象
class TestDialog(wx.Dialog):
def __init__(self, parent):
wx.Dialog.__init__(self, parent, -1)
b = wx.Button(self, -1, "print", (50, 140))
self.Bind(wx.EVT_BUTTON, self.OnPrint, b)
self.thread = threading.Thread(target=self.work)
self.thread.start()
def work(self):
while True:
print 3
autoEvent.Wait() # 阻塞
def OnPrint(self, evt):
autoEvent.Set() # 繼續(xù)
if __name__=="__main__":
app = wx.App()
f = TestDialog(parent=None)
f.Show()
app.MainLoop()
當程序執(zhí)行時,首先會打印出來個 ‘3',后面沒點擊一下print按鈕,則會打印一個 '3'
測試成功。
注意:如果你將Demo代碼中的 autoEvent.Wait()和autoEvent.Set() 改成 threading.Event()類的wait()和set()方法,結果會如下:當程序執(zhí)行時,會打印個'3' ,后面點擊print按鈕后,會一直循環(huán)打印'3'
您可能感興趣的文章:
- Python多線程編程(八):使用Event實現線程間通信
- Python多線程同步Lock、RLock、Semaphore、Event實例
- Python多進程同步Lock、Semaphore、Event實例
- python多線程threading.Lock鎖用法實例
- 詳解Python中的多線程編程
- python多線程編程中的join函數使用心得
- 淺析Python中的多進程與多線程的使用
- python通過線程實現定時器timer的方法
- 理解python多線程(python多線程簡明教程)
- python殺死一個線程的方法
- Python threading多線程編程實例
- 淺析Python多線程下的變量問題
- Python編程之event對象的用法實例分析
相關文章
C#中winform窗體實現注冊/登錄功能實例(DBHelper類)
在編寫項目時,編寫了一部分關于登錄頁面的一些代碼,下面這篇文章主要給大家介紹了關于C#中winform窗體實現注冊/登錄功能(DBHelper類)的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-06-06

