时间:2021-05-19
搞过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'
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了PHP实现非阻塞模式的方法。分享给大家供大家参考,具体如下:程序非阻塞模式,这里也可以理解成并发。而并发又暂且可以分为网络请求并发和本地并发。先说
LinuxUDPsocket设置为的非阻塞模式与阻塞模式区别UDPsocket设置为的非阻塞模式Len=recvfrom(SocketFD,szRecvBuf,
有如下的xml文件:复制代码代码如下:12下面介绍python解析xml文件的几种方法,使用python模块实现。方式1,python模块实现自动遍历所有节点:
本文实例讲述了Python实现子类调用父类的方法。分享给大家供大家参考。具体实现方法如下:python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它
一、单例模式a、单例模式分为四种:文件,类,基于__new__方法实现单例模式,基于metaclass方式实现b、类实现如下:classSigletion(ob