python實現AutoResetEvent類的阻塞模式方法解析

來源:互聯網
上載者:User

搞過C#多線程的人對其中的AutoResetEvent和ManualResetEvent這兩個類都理解,其中的WaitOne()方法和Set()以及Reset()方法線上程同步當中用的是比較多的。
AutoResetEvent :當某個線程執行到WaitOne()方法時,該線程則會處於阻塞模式,當被調用了Set()方法,阻塞的線程則會繼續向下執行,其狀態立即被自動化佈建為阻塞模式。
ManualResetEvent :當某個線程執行到WaitOne()方法時,該線程則會處於阻塞模式,當被調用了Set()方法,阻塞的線程則會繼續向下執行,其狀態不會被自動化佈建為阻塞模式,必須調用其Reset()方法才會將其狀態設定為阻塞模式。

在python中threading模組下也有一個類似的線程阻塞模式的類threading.Event(),這個類類似於C#的ManualResetEvent類,在調用set()方法後不能自動變為阻塞模式。有些時候我們在開發項目當中需要這種自動的阻塞模式,我在項目當中也遇到過這種需求,就嘗試自己寫了個類似的類,吧代碼貼出來分享下,代碼不多,有不對或者是不合理的地方希望大蝦們或者是前輩們能指出,謝謝!
代碼如下: 複製代碼 代碼如下:# encoding: UTF-8
import threading
class AutoEvent:
def __init__(self):
self.event = None
self.is_wait = False # 是否處於阻塞狀態
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()方法,讓線程處於阻塞狀態
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()方法,讓線程處於繼續

下面是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() # 繼續
if __name__=="__main__":
app = wx.App()
f = TestDialog(parent=None)
f.Show()
app.MainLoop()

當程式執行時,首先會列印出來個 ‘3',後面沒點擊一下print按鈕,則會列印一個 '3'
測試成功。
注意:如果你將Demo代碼中的 autoEvent.Wait()和autoEvent.Set() 改成 threading.Event()類的wait()和set()方法,結果會如下:當程式執行時,會列印個'3' ,後面點擊print按鈕後,會一直迴圈列印'3'

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.