Chinaunix首页 | 论坛 | 博客
  • 博客访问: 756603
  • 博文数量: 190
  • 博客积分: 2991
  • 博客等级: 少校
  • 技术积分: 2400
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-24 18:11
文章分类

全部博文(190)

文章存档

2015年(3)

2014年(1)

2013年(65)

2012年(121)

我的朋友

分类: 系统运维

2012-12-30 14:08:24

搞过C#多线程的人对其中的AutoResetEvent和ManualResetEvent这两个类都理解,其中的WaitOne()方法和Set()以及Reset()方法在线程同步当中用的是比较多的。
AutoResetEvent :当某个线程执行到WaitOne()方法时,该线程则会处于阻塞模式,当被调用了Set()方法,阻塞的线程则会继续向下执行,其状态立即被自动设置为阻塞模式。
ManualResetEvent :当某个线程执行到WaitOne()方法时,该线程则会处于阻塞模式,当被调用了Set()方法,阻塞的线程则会继续向下执行,其状态不会被自动设置为阻塞模式,必须调用其Reset()方法才会将其状态设置为阻塞模式。
在python中threading模块下也有一个类似的线程阻塞模式的类threading.Event(),这个类类似于C#的ManualResetEvent类,在调用set()方法后不能自动变为阻塞模式。有些时候我们在开发项目当中需要这种自动的阻塞模式,我在项目当中也遇到过这种需求,就尝试自己写了个类似的类,吧代码贴出来分享下,代码不多,有不对或者是不合理的地方希望大虾们或者是前辈们能指出,谢谢!
代码如下:
  1. # encoding: UTF-8   
  2. import threading  
  3. class AutoEvent:  
  4.     def __init__(self):  
  5.         self.event = None  
  6.         self.is_wait = False  # 是否处于阻塞状态  
  7.     def Wait(self,timeout=None):  
  8.         if not self.is_wait:  
  9.             self.is_wait = True  
  10.             self.event = threading.Event()    # 实例化threading.Event()对象  
  11.             self.event.wait(timeout=timeout)  # 调用threading.Event().wait()方法,让线程处于阻塞状态  
  12.             del self.event   # 释放对象  
  13.     def Set(self):  
  14.         if not self.is_wait:raise 'must be invoke Wait() method before Set()'  
  15.         self.is_wait = False  
  16.         self.event.set()   # 调用threading.Event().set()方法,让线程处于继续  
下面是Demo,用来测试的:
  1. import wx  
  2. autoEvent = AutoEvent()  # 实例化MamualEvent对象  
  3.   
  4. class TestDialog(wx.Dialog):  
  5.     def __init__(self, parent):  
  6.         wx.Dialog.__init__(self, parent, -1)  
  7.   
  8.         b = wx.Button(self, -1"print", (50140))  
  9.         self.Bind(wx.EVT_BUTTON, self.OnPrint, b)   
  10.         self.thread = threading.Thread(target=self.work)  
  11.         self.thread.start()  
  12.     def work(self):  
  13.         while True:  
  14.             print 3  
  15.             autoEvent.Wait()   # 阻塞  
  16.       def OnPrint(self, evt):  
  17.         autoEvent.Set()   # 继续  
  18. if __name__=="__main__":  
  19.     app = wx.App()  
  20.     f = TestDialog(parent=None)  
  21.     f.Show()  
  22.     app.MainLoop()  
当程序执行时,首先会打印出来个 ‘3’,后面没点击一下print按钮,则会打印一个 '3' 
测试成功。
注意:如果你将Demo代码中的 autoEvent.Wait()和autoEvent.Set() 改成 threading.Event()类的wait()和set()方法,结果会如下:当程序执行时,会打印个'3' ,后面点击print按钮后,会一直循环打印'3'
源文来自中心
阅读(1166) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~