python实现AutoResetEvent类的阻塞模式方法解析
2023-06-13 09:14:41 时间
搞过C#多线程的人对其中的AutoResetEvent和ManualResetEvent这两个类都理解,其中的WaitOne()方法和Set()以及Reset()方法在线程同步当中用的是比较多的。
AutoResetEvent:当某个线程执行到WaitOne()方法时,该线程则会处于阻塞模式,当被调用了Set()方法,阻塞的线程则会继续向下执行,其状态立即被自动设置为阻塞模式。
ManualResetEvent:当某个线程执行到WaitOne()方法时,该线程则会处于阻塞模式,当被调用了Set()方法,阻塞的线程则会继续向下执行,其状态不会被自动设置为阻塞模式,必须调用其Reset()方法才会将其状态设置为阻塞模式。
在python中threading模块下也有一个类似的线程阻塞模式的类threading.Event(),这个类类似于C#的ManualResetEvent类,在调用set()方法后不能自动变为阻塞模式。有些时候我们在开发项目当中需要这种自动的阻塞模式,我在项目当中也遇到过这种需求,就尝试自己写了个类似的类,吧代码贴出来分享下,代码不多,有不对或者是不合理的地方希望大虾们或者是前辈们能指出,谢谢!
代码如下:
复制代码代码如下:
AutoResetEvent:当某个线程执行到WaitOne()方法时,该线程则会处于阻塞模式,当被调用了Set()方法,阻塞的线程则会继续向下执行,其状态立即被自动设置为阻塞模式。
ManualResetEvent:当某个线程执行到WaitOne()方法时,该线程则会处于阻塞模式,当被调用了Set()方法,阻塞的线程则会继续向下执行,其状态不会被自动设置为阻塞模式,必须调用其Reset()方法才会将其状态设置为阻塞模式。
在python中threading模块下也有一个类似的线程阻塞模式的类threading.Event(),这个类类似于C#的ManualResetEvent类,在调用set()方法后不能自动变为阻塞模式。有些时候我们在开发项目当中需要这种自动的阻塞模式,我在项目当中也遇到过这种需求,就尝试自己写了个类似的类,吧代码贴出来分享下,代码不多,有不对或者是不合理的地方希望大虾们或者是前辈们能指出,谢谢!
代码如下:
#encoding:UTF-8
importthreading
classAutoEvent:
def__init__(self):
self.event=None
self.is_wait=False#是否处于阻塞状态
defWait(self,timeout=None):
ifnotself.is_wait:
self.is_wait=True
self.event=threading.Event()#实例化threading.Event()对象
self.event.wait(timeout=timeout)#调用threading.Event().wait()方法,让线程处于阻塞状态
delself.event#释放对象
defSet(self):
ifnotself.is_wait:raise"mustbeinvokeWait()methodbeforeSet()"
self.is_wait=False
self.event.set()#调用threading.Event().set()方法,让线程处于继续
下面是Demo,用来测试的:
importwx
autoEvent=AutoEvent()#实例化MamualEvent对象
classTestDialog(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()
defwork(self):
whileTrue:
print3
autoEvent.Wait()#阻塞
defOnPrint(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"
相关文章
- pycharm2020.3.4安装教程_python安装pycharm的方法
- Python 二进制,十进制,十六进制转换「建议收藏」
- python的random()函数用法_Python随机函数random用法示例
- python基础系列教程——Python的安装与测试:python解释器、PyDev编辑器、pycharm编译器
- 70行Python代码,获取中国数据库大会(DTCC)全部PPT
- Python 技巧篇-pip卸载python库实例演示,查看pip命令大全方法[通俗易懂]
- 【说站】python清洗文件数据的方法
- 【说站】python有几种排序的方法
- 【说站】python有哪些is开头的字符串方法
- python zipfile.zipfile_confirm password
- python读取图像的几种方法_python图像识别教程
- python2 nonlocal_Python nonlocal
- python hexdump_笨办法学 Python · 续 练习 26:`hexdump`
- vim 搜索字符串_python查找字符串位置
- python归一化函数_机器学习-归一化方法
- pycharm如何调试python程序_Pycharm断点调试Python程序的步骤方法
- 【7】python_matplotlib 输出(保存)矢量图方法;画图时图例说明(legend)放到图像外侧;Python_matplotlib图例放在外侧保存时显示不完整问题解决
- python交互模式下方向键乱码的正确解决方法
- 软件测试|Python数据可视化神器——pyecharts教程(一)
- 如何使用Python对嵌套结构的JSON进行遍历获取链接并下载文件
- python通过get方式,post方式发送http请求和接收http响应-urllib urllib2详解编程语言
- Python在MSSQL中的应用实践(python与mssql)
- Python生成随机数的方法
- c++生成dll使用python调用dll的方法
- 2款Python内存检测工具介绍和使用方法
- Python动态加载模块的3种方法
- python文件读写操作与linuxshell变量命令交互执行的方法
- Python中使用异常处理来判断运行的操作系统平台方法