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的更多相关文章

  1. 扯扯python的多线程的同步锁 Lock RLock Semaphore Event Condition

    我想大家都知道python的gil限制,记得刚玩python那会,知道了有pypy和Cpython这样的解释器,当时听说是很猛,也就意味肯定是突破了gil的限制,最后经过多方面测试才知道,还是那德行… ...

  2. python 多线程中的同步锁 Lock Rlock Semaphore Event Conditio

    摘要:在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lo ...

  3. 1Z0-053 争议题目解析697

    1Z0-053 争议题目解析697 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 697.Which statement is true about a Scheduler-gen ...

  4. Python-09-线程、进程、协程、异步IO

    0. 什么是线程(thread)? 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆 ...

  5. Python Day10

    进程 在python中multiprocess模块提供了Process类,实现进程相关的功能.但是,由于它是基于fork机制的,因此不被windows平台支持.想要在windows中运行,必须使用if ...

  6. AngularJS 分页

    前端源码: <div> <h1>列表页33</h1> <table> <thead> <tr><td>CandiID ...

  7. python学习笔记12 ----线程、进程

    进程和线程的概念 进程和线程是操作系统中两个很重要的概念,对于一般的程序,可能有若干个进程,每一个进程有若干个同时执行的线程.进程是资源管理的最小单位,线程是程序执行的最小单位(线程可共享同一进程里的 ...

  8. Python之线程、进程和协程

    python之线程.进程和协程 目录: 引言 一.线程 1.1 普通的多线程 1.2 自定义线程类 1.3 线程锁 1.3.1 未使用锁 1.3.2 普通锁Lock和RLock 1.3.3 信号量(S ...

  9. Python_进程、线程及协程

    一.Python进程 IO密集型----多线程 计算密集型----多进程 1.单进程 from multiprocessing import Process def foo(i): print('你好 ...

随机推荐

  1. HTML DOM 事件

    HTML DOM 事件 HTML DOM 事件 HTML DOM 事件允许Javascript在HTML文档元素中注册不同事件处理程序. 事件通常与函数结合使用,函数不会在事件发生前被执行! (如用户 ...

  2. 【点滴积累,厚积薄发】修改hosts,并刷新dns缓存

    Windows系统下hosts位置 C:\Windows\System32\drivers\etc 修改hosts后,要想马上生效,需要运行命令来刷新DNS缓存:ipconfig /flushdns

  3. iOS开发 传感器(加速计、摇一摇、计步器)

    一.传感器 1.什么是传感器传感器是一种感应\检测周围环境的一种装置, 目前已经广泛应用于智能手机上 传感器的作用用于感应\检测设备周边的信息不同类型的传感器, 检测的信息也不一样 iPhone中的下 ...

  4. 您的项目引用了最新实体框架;但是,找不到数据链接所需的与版本兼容的实体框架数据库 EF6使用Mysql的技巧

    转载至: http://www.cnblogs.com/Imaigne/p/4153397.html 您的项目引用了最新实体框架:但是,找不到数据链接所需的与版本兼容的实体框架数据库 EF6使用Mys ...

  5. hadoop家族之pig入门

    昨天成功运行第一个在hadoop集群上面的python版本的wordcount,今天白天继续看网上提供的文档.下午上头给定的回复是把hadoop家族都熟悉一下,那就恭敬不如从命,开始学习pig吧- 这 ...

  6. left join 条件区别

    t1: num | name-----+------ 1      | a 2      | b 3      | c t2: num | value-----+------- 1  | xxx 3 ...

  7. idea配置。

    1.project Structure — 修改project(1.name,sdk,level(6-@Override in interface)) 修改modules(点击web,加上source ...

  8. canvas 2d 贴图技术实践

    最近在公司内部的技术协会论坛里闲逛的时候,无意中发现了一篇手淘前端大牛岑安两年前写的博文,讲述了canvas的2d贴图技术.看到后觉得相当神奇.于是就自己实现了一下.不过岑安前辈的那篇博文也只是大概讲 ...

  9. VS2013 无法在Web服务器上启动调试。IIS未列出与打开的URL匹配的网站。

    出现这个问题的原因是:没有用管理员权限运行VS2013. 本来遇到这个问题的时候,不知道什么原因.后来附加到进程调试的时候,提示要以管理员身份运行.才知道啥原因.

  10. Learning jQuery, 4th Edition 勘误表

    来源于:http://book.learningjquery.com/3145/errata/ Chapter 1 page 14 The CSS snippet is correct, but it ...