当前位置: 移动技术网 > IT编程>脚本编程>Python > python实现C#中类似于AutoResetEvent类的阻塞模式

python实现C#中类似于AutoResetEvent类的阻塞模式

2019年04月05日  | 移动技术网IT编程  | 我要评论

中国矿业论坛,河南四维彩超预约ok,至尊刁民

搞过c#多线程的人对其中的autoresetevent和manualresetevent这两个类都理解,其中的waitone()方法和set()以及reset()方法在线程同步当中用的是比较多的。

autoresetevent :当某个线程执行到waitone()方法时,该线程则会处于阻塞模式,当被调用了set()方法,阻塞的线程则会继续向下执行,其状态立即被自动设置为阻塞模式。

manualresetevent :当某个线程执行到waitone()方法时,该线程则会处于阻塞模式,当被调用了set()方法,阻塞的线程则会继续向下执行,其状态不会被自动设置为阻塞模式,必须调用其reset()方法才会将其状态设置为阻塞模式。 www.2cto.com

在python中threading模块下也有一个类似的线程阻塞模式的类threading.event(),这个类类似于c#的manualresetevent类,在调用set()方法后不能自动变为阻塞模式。有些时候我们在开发项目当中需要这种自动的阻塞模式,我在项目当中也遇到过这种需求,就尝试自己写了个类似的类,吧代码贴出来分享下,代码不多,有不对或者是不合理的地方希望大虾们或者是前辈们能指出,谢谢!

代码如下:

[python] 
# 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,用来测试的:
[python] 
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'

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网