欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python实现AutoResetEvent类的阻塞模式方法解析

程序员文章站 2023-12-06 11:19:22
搞过c#多线程的人对其中的autoresetevent和manualresetevent这两个类都理解,其中的waitone()方法和set()以及reset()方法在线程...
搞过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'