python小点心--Event
2016-02-16 09:38
549 查看
多线程,看起来很美好,但子线程间的互斥与协作,线程间的同步真的是让人头疼,今天,介绍一下 Event
Event可以用来做线程间的通信,使用起来非常简单
下面介绍它的方法:
1、wait()
望文生义,就是等待的意思嘛
2、set()
这个方法会将内部信号标志设置为True,上面说到wait(),是等待的意思,等的就是这个信号标志变为True,如果内部信号标志为False,wait()就一直阻塞在那里,后面的语句无法执行
3、clear()
这个函数的作用恰好与set()相反,它将内部信号标志设置False
来一个具体的问题体验一下如何使用evnet
有四个线程,分别打印a,b,c,d,现在要求按照a,b,c,d的顺序打印一百次。
线程一旦启动,就会按照自己的逻辑进行运算,打印a的线程就会一直打印a,打印b的线程就会一直打印b,每个线程都不知道其他三个线程在做什么。要想按照一定的顺序打印,就必须做到线程间的通信,打印a的线程告诉打印b的线程:我已经打印完了,该你了。打印b的线程在打印结束后告诉c,c告诉d,d再告诉a,这样子循环100次。那么问题来了,最初谁来告诉打印a的线程呢?当然是主线程
上代码:
每个线程都有一个event对象,主线程唤醒打印a的线程,a唤醒b,b唤醒c,以此类推。打印次数我们用Queue 来控制,它是线程安全的。
Event可以用来做线程间的通信,使用起来非常简单
event = threading.Event()上面的语句生成了一个evnet对象,event对象内部有一个内部信号标志,一个新生成的event对象的内部信号标志是False
下面介绍它的方法:
1、wait()
望文生义,就是等待的意思嘛
2、set()
这个方法会将内部信号标志设置为True,上面说到wait(),是等待的意思,等的就是这个信号标志变为True,如果内部信号标志为False,wait()就一直阻塞在那里,后面的语句无法执行
3、clear()
这个函数的作用恰好与set()相反,它将内部信号标志设置False
来一个具体的问题体验一下如何使用evnet
有四个线程,分别打印a,b,c,d,现在要求按照a,b,c,d的顺序打印一百次。
线程一旦启动,就会按照自己的逻辑进行运算,打印a的线程就会一直打印a,打印b的线程就会一直打印b,每个线程都不知道其他三个线程在做什么。要想按照一定的顺序打印,就必须做到线程间的通信,打印a的线程告诉打印b的线程:我已经打印完了,该你了。打印b的线程在打印结束后告诉c,c告诉d,d再告诉a,这样子循环100次。那么问题来了,最初谁来告诉打印a的线程呢?当然是主线程
上代码:
#coding=utf-8 ''' Created on 2016-1-19 @author: Administrator ''' import threading import Queue mq = Queue.Queue() count = 100 def worker(event,eventnext,s): global count global mq while True: event.wait() if s=='a': print '第' +str(mq.qsize()+1) +'次' print s event.clear() eventnext.set() if s =='a': mq.put(1) if mq.qsize() == count: break eventLst = [threading.Event() for i in range(4)] t1 = threading.Thread(target=worker, args=(eventLst[0],eventLst[1],'a')) t2 = threading.Thread(target=worker, args=(eventLst[1],eventLst[2],'b')) t3 = threading.Thread(target=worker, args=(eventLst[2],eventLst[3],'c')) t4 = threading.Thread(target=worker, args=(eventLst[3],eventLst[0],'d')) t1.start() t2.start() t3.start() t4.start() eventLst[0].set()
每个线程都有一个event对象,主线程唤醒打印a的线程,a唤醒b,b唤醒c,以此类推。打印次数我们用Queue 来控制,它是线程安全的。
相关文章推荐
- 深入解读Python解析XML的几种方式
- python(3)-内置函数2
- Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python
- Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python
- Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python
- 我的Mac之路(1)—— 安装虚拟机,以及打造VIM IDE for Python
- python语法学习
- 深入解读Python解析XML的几种方式
- bpython 功能强大的Python shell
- 十条建议帮你提高Python编程效率
- 轻松实现python搭建微信公众平台
- python实现红包裂变算法
- Python实现快速排序和插入排序算法及自定义排序的示例
- Python的GUI框架PySide的安装配置教程
- Python:__slots__用法
- 转 python常用代码
- python学习day day up
- 非常全面到位的介绍与源代码地址 :Python 网页爬虫 & 文本处理 & 科学计算 & 机器学习 & 数据挖掘兵器谱
- python实现快速排序
- leetcode 238. Product of Array Except Self (Python版)