国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C# > 正文

python實(shí)現(xiàn)AutoResetEvent類的阻塞模式方法解析

2020-01-24 03:39:18
字體:
供稿:網(wǎng)友
搞過C#多線程的人對(duì)其中的AutoResetEvent和ManualResetEvent這兩個(gè)類都理解,其中的WaitOne()方法和Set()以及Reset()方法在線程同步當(dāng)中用的是比較多的。
AutoResetEvent :當(dāng)某個(gè)線程執(zhí)行到WaitOne()方法時(shí),該線程則會(huì)處于阻塞模式,當(dāng)被調(diào)用了Set()方法,阻塞的線程則會(huì)繼續(xù)向下執(zhí)行,其狀態(tài)立即被自動(dòng)設(shè)置為阻塞模式。
ManualResetEvent :當(dāng)某個(gè)線程執(zhí)行到WaitOne()方法時(shí),該線程則會(huì)處于阻塞模式,當(dāng)被調(diào)用了Set()方法,阻塞的線程則會(huì)繼續(xù)向下執(zhí)行,其狀態(tài)不會(huì)被自動(dòng)設(shè)置為阻塞模式,必須調(diào)用其Reset()方法才會(huì)將其狀態(tài)設(shè)置為阻塞模式。

在python中threading模塊下也有一個(gè)類似的線程阻塞模式的類threading.Event(),這個(gè)類類似于C#的ManualResetEvent類,在調(diào)用set()方法后不能自動(dòng)變?yōu)樽枞J健S行r(shí)候我們?cè)陂_發(fā)項(xiàng)目當(dāng)中需要這種自動(dòng)的阻塞模式,我在項(xiàng)目當(dāng)中也遇到過這種需求,就嘗試自己寫了個(gè)類似的類,吧代碼貼出來分享下,代碼不多,有不對(duì)或者是不合理的地方希望大蝦們或者是前輩們能指出,謝謝!
代碼如下:
復(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() # 實(shí)例化threading.Event()對(duì)象
self.event.wait(timeout=timeout) # 調(diào)用threading.Event().wait()方法,讓線程處于阻塞狀態(tài)
del self.event # 釋放對(duì)象
def Set(self):
if not self.is_wait:raise 'must be invoke Wait() method before Set()'
self.is_wait = False
self.event.set() # 調(diào)用threading.Event().set()方法,讓線程處于繼續(xù)

下面是Demo,用來測(cè)試的:
復(fù)制代碼 代碼如下:

import wx
autoEvent = AutoEvent() # 實(shí)例化MamualEvent對(duì)象
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()

當(dāng)程序執(zhí)行時(shí),首先會(huì)打印出來個(gè) ‘3',后面沒點(diǎn)擊一下print按鈕,則會(huì)打印一個(gè) '3'
測(cè)試成功。
注意:如果你將Demo代碼中的 autoEvent.Wait()和autoEvent.Set() 改成 threading.Event()類的wait()和set()方法,結(jié)果會(huì)如下:當(dāng)程序執(zhí)行時(shí),會(huì)打印個(gè)'3' ,后面點(diǎn)擊print按鈕后,會(huì)一直循環(huán)打印'3'
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 习水县| 雷山县| 滕州市| 通道| 孟连| 黑龙江省| 乐平市| 东兴市| 邮箱| 丹棱县| 宁河县| 嘉黎县| 和林格尔县| 江川县| 墨江| 比如县| 田阳县| 顺平县| 方山县| 乌兰县| 甘泉县| 电白县| 大悟县| 和林格尔县| 济宁市| 滁州市| 托克逊县| 灵川县| 沙坪坝区| 东兴市| 湛江市| 科技| 常熟市| 神农架林区| 双峰县| 惠东县| 西和县| 汉川市| 泽普县| 萝北县| 永福县|