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

13 篇文章 0 订阅
1 篇文章 0 订阅

搞过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'


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值