Event&Condition pyton
Event
一个线程需要根据另外一个线程的状态来确定自己的下一步操作,需要调用threading库中Event对象;Event包含一个可由线程设置的信号标志,在初始情况下,event对象的标志位为假(false);。如果一个线程等待一个event对象,而这个event对象标志为假,那么这个线程将会被一直阻塞到标志为真(true);。
同理:一个线程如果将一个event对象的信号标志设置为真,它将唤醒所有等待这个event对象的线程。
如果一个线程等待一个已经被设置为真的event对象,那么它将忽略这个事件,继续执行。
#!/usr/bin/env python
# encoding: utf-8
"""
@author: 侠之大者kamil
@file: Event_test.py
@time: 2016/3/23 9:42
"""
from threading import Thread ,Event
import time
def countdown(n,started_evt):
print('countdown starting',time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
started_evt.set()
while n >0:
print("T-time_kamil:",n)
n -=1
time.sleep(2)
started_evt = Event()
print("Launching countdown",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
t = Thread(target=countdown,args=(5,started_evt))
t.start()
started_evt.wait()
print("countdown is running",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
结果:
C:\Python34\python.exe D:/kamil/Documents/py/process/Event_test.py
Launching countdown 2016-03-23 16:03:28
countdown starting 2016-03-23 16:03:28
T-time_kamil: 5
countdown is running 2016-03-23 16:03:28
T-time_kamil: 4
T-time_kamil: 3
T-time_kamil: 2
T-time_kamil: 1 Process finished with exit code 0
Condition
如果一个线程需要不停重复的使用event对象,最好使用condition对象实现一个周期定时器,每当定时器超时的时候,其他线程都可以检测到:
#!/usr/bin/env python
# encoding: utf-8
"""
@author: 侠之大者kamil
@file: event_test2.py
@time: 2016/3/23 14:45
"""
import time,threading
class PeriodicTimer:
def __init__(self,interval):
self._interval = interval
self._flag = 0
self._cv = threading.Condition()#使用Condition对象可以在某些事件触发或者达到特定的条件后才处理数据 def start(self):
t = threading.Thread(target=self.run)
t.daemon = True#Daemon线程表明整个Python主程序只有在Daemon子线程运行时可以退出.
t.start()
def run(self):
while True:
time.sleep(self._interval)
with self._cv:
self._flag ^=1
self._cv.notify_all()
def wait_for_tick(self):
with self._cv:
last_flag = self._flag
while last_flag == self._flag:
self._cv.wait()
ptimer = PeriodicTimer(5)
ptimer.start() def countdown(nticks):
while nticks > 0 :
ptimer.wait_for_tick()
print("t_time",nticks)
nticks -= 1
def countup(last):
n = 0
while n < last:
ptimer.wait_for_tick()
print("counting",n)
n +=1 threading.Thread(target=countdown,args=(6,)).start()
threading.Thread(target=countup,args=(3,)).start()
结果:
C:\Python34\python.exe D:/kamil/Documents/py/process/event_test2.py
t_time 6
counting 0
t_time 5
counting 1
t_time 4
counting 2
t_time 3
t_time 2
t_time 1 Process finished with exit code 0
如上文中event在为真后,所有等待的进程都要开始,如果只想唤起一个进程,那可以使用Condition 对象来替代
Event&Condition pyton的更多相关文章
- 扯扯python的多线程的同步锁 Lock RLock Semaphore Event Condition
我想大家都知道python的gil限制,记得刚玩python那会,知道了有pypy和Cpython这样的解释器,当时听说是很猛,也就意味肯定是突破了gil的限制,最后经过多方面测试才知道,还是那德行… ...
- python 多线程中的同步锁 Lock Rlock Semaphore Event Conditio
摘要:在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lo ...
- 1Z0-053 争议题目解析697
1Z0-053 争议题目解析697 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 697.Which statement is true about a Scheduler-gen ...
- Python-09-线程、进程、协程、异步IO
0. 什么是线程(thread)? 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆 ...
- Python Day10
进程 在python中multiprocess模块提供了Process类,实现进程相关的功能.但是,由于它是基于fork机制的,因此不被windows平台支持.想要在windows中运行,必须使用if ...
- AngularJS 分页
前端源码: <div> <h1>列表页33</h1> <table> <thead> <tr><td>CandiID ...
- python学习笔记12 ----线程、进程
进程和线程的概念 进程和线程是操作系统中两个很重要的概念,对于一般的程序,可能有若干个进程,每一个进程有若干个同时执行的线程.进程是资源管理的最小单位,线程是程序执行的最小单位(线程可共享同一进程里的 ...
- Python之线程、进程和协程
python之线程.进程和协程 目录: 引言 一.线程 1.1 普通的多线程 1.2 自定义线程类 1.3 线程锁 1.3.1 未使用锁 1.3.2 普通锁Lock和RLock 1.3.3 信号量(S ...
- Python_进程、线程及协程
一.Python进程 IO密集型----多线程 计算密集型----多进程 1.单进程 from multiprocessing import Process def foo(i): print('你好 ...
随机推荐
- jquery中取消和绑定hover事件的正确方式
在网页设计中,我们经常使用jquery去响应鼠标的hover事件,和mouseover和mouseout事件有相同的效果,但是这其中其中如何使用bind去绑定hover方法呢?如何用unbind取消绑 ...
- pullRefresh组件配置
mui.init({ pullRefresh:{ container: '#contanier', indicators:false, up:{ height:200, contentinit: '' ...
- 自定义JS常用方法
1,获取表格中的元素,支持IE,chrome,firefox //获取表单元素的某一个值 function getTableColumnValue(tableId, rowNumber, column ...
- Mysql LIMIT如何正确对其进行优化
Mysql LIMIT如何正确对其进行优化 2010-05-17 17:09 佚名 博客园 字号:T | T 我们今天主要和大家分享的是Mysql LIMIT简单介绍以及如何进行优化的相关内容的描述, ...
- 微软职位内部推荐-B&I Site Lead
微软近期Open的职位: Job Title: B&I Site Lead Division: Phones Quality, SWIQ Location: Beijing, China Mi ...
- C语言 自动修改文件名小程序
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...
- IE8中给HTML标签负值报错问题
当通过JS给一个HTML标签设置高宽为负值的时候,会爆出一个“参数无效”的错误 chrome下不会报错,但是元素不会做任何关于负值的改变
- Java7并发编程实战(一) 守护线程的创建和运行
Java里有一种特殊的线程叫做守护(Daemon)线程,这种线程的优先级很低,通常来说,当一个应用程序里面没有其他线程运行的时候,守护线程才运行,当线程是程序中唯一运行的线程时,守护线程执行结束后,J ...
- CUDA2.2-原理之存储器访问
本小节来自<大规模并行处理器编程实战>第四节,该书是很好的从内部原理结构上来讲述了CUDA的,对于理解CUDA很有帮助,借以博客的形式去繁取间,肯定会加入自己个人理解,所以有错误之处还望指 ...
- JavaScript 位运算总结&拾遗
最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个 ...