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

 更新时间:2012年11月16日 11:21:43   作者:  
AutoResetEvent :当某个线程执行到WaitOne()方法时,该线程则会处于阻塞模式,当被调用了Set()方法,阻塞的线程则会继续向下执行,其状态立即被自动设置为阻塞模式
搞过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'

相关文章

  • C#定制Excel界面并实现与数据库交互的方法

    C#定制Excel界面并实现与数据库交互的方法

    这篇文章主要介绍了C#定制Excel界面并实现与数据库交互的方法的相关资料,需要的朋友可以参考下
    2015-11-11
  • c# 实现观察者模式

    c# 实现观察者模式

    这篇文章主要介绍了c# 实现观察者模式的步骤,帮助大家更好的理解和使用c#实现设计模式,感兴趣的朋友可以了解下
    2021-01-01
  • Unity shader实现移动端模拟深度水效果

    Unity shader实现移动端模拟深度水效果

    这篇文章主要为大家详细介绍了Unity shader实现移动端模拟深度水效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C#中this的使用实例分析

    C#中this的使用实例分析

    这篇文章主要介绍了C#中this的使用方法,this是C#程序设计中非常重要的一个关键字,本文以实例形式对此作出简单的用法分析,需要的朋友可以参考下
    2014-08-08
  • C#生成带注释的dll并引用实现

    C#生成带注释的dll并引用实现

    本文主要介绍了C#生成带注释的dll并引用实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • C#中winform窗体实现注册/登录功能实例(DBHelper类)

    C#中winform窗体实现注册/登录功能实例(DBHelper类)

    在编写项目时,编写了一部分关于登录页面的一些代码,下面这篇文章主要给大家介绍了关于C#中winform窗体实现注册/登录功能(DBHelper类)的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • 浅谈C#.NET、JavaScript和JSON

    浅谈C#.NET、JavaScript和JSON

    本文介绍了C#.NET、JavaScript和JSON的相关知识,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • C#控件闪烁的解决方法

    C#控件闪烁的解决方法

    这篇文章主要介绍了C#控件闪烁的解决方法,涉及SetStyle函数的使用技巧,需要的朋友可以参考下
    2015-01-01
  • C#实现简单的双色球抽取中奖号码代码

    C#实现简单的双色球抽取中奖号码代码

    这篇文章主要介绍了C#实现简单的双色球抽取中奖号码代码的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • 详解C#中委托的概念与使用

    详解C#中委托的概念与使用

    委托这个名字取的神乎其神的,但实质是函数式编程,把函数作为参数传递给另一个参数。这篇文章主要为大家介绍一下C#中委托的概念与使用,需要的可以参考一下
    2023-02-02

最新评论