Event

事件对象管理一个内部标志,通过set()方法将其设置为True,并使用clear()方法将其设置为Falsewait()方法阻塞,直到标志为True。该标志初始为False

方法:

is_set()

当且仅当内部标志为True时返回True

set()

将内部标志设置为True。所有等待它成为True的线程都被唤醒。当标志保持在True的状态时,线程调用wait()是不会阻塞的。

clear()

将内部标志重置为False。随后,调用wait()的线程将阻塞,直到另一个线程调用set()将内部标志重新设置为True

wait(timeout=None)

阻塞直到内部标志为真。如果内部标志在wait()方法调用时为True,则立即返回。否则,则阻塞,直到另一个线程调用set()将标志设置为True,或发生超时。

该方法总是返回True,除非设置了timeout并发生超时。

生产者与消费之--Event版

  1. # -*- coding:utf-8 -*-
  2. import threading
  3. import time
  4. import queue
  5. event = threading.Event()
  6. goods = queue.Queue(5)
  7. num = 0
  8. class Producer(threading.Thread):
  9. def run(self):
  10. global num
  11. while True:
  12. if goods.empty():
  13. event.clear()
  14. for _ in range(5):
  15. goods.put('商品-' + str(num))
  16. print('生产了商品-{0}.'.format(str(num)))
  17. num += 1
  18. time.sleep(1)
  19. event.set()
  20. class Customer(threading.Thread):
  21. def __init__(self, *args, **kwargs):
  22. super().__init__(*args, **kwargs)
  23. self.money = 7
  24. def run(self):
  25. while self.money:
  26. event.wait()
  27. self.money -= 1
  28. print('{0} 买了一个{1}.'.format(
  29. threading.current_thread().name, goods.get()))
  30. time.sleep(1)
  31. print('{0}没钱了,回家.'.format(threading.current_thread().name))
  32. if __name__ == '__main__':
  33. p = Producer(daemon=True)
  34. c1 = Customer(name='Alice')
  35. c2 = Customer(name='Bob')
  36. c2.start()
  37. p.start()
  38. c1.start()
  39. c1.join()
  40. c2.join()

运行结果:

  1. 生产了商品-0.
  2. 生产了商品-1.
  3. 生产了商品-2.
  4. 生产了商品-3.
  5. 生产了商品-4.
  6. Alice 买了一个商品-0.
  7. Bob 买了一个商品-1.
  8. Alice 买了一个商品-2.
  9. Bob 买了一个商品-3.
  10. Alice 买了一个商品-4.
  11. 生产了商品-5.
  12. 生产了商品-6.
  13. 生产了商品-7.
  14. 生产了商品-8.
  15. 生产了商品-9.
  16. Alice 买了一个商品-5.
  17. Bob 买了一个商品-6.
  18. Alice 买了一个商品-7.
  19. Bob 买了一个商品-8.
  20. 生产了商品-10.
  21. Alice 买了一个商品-9.
  22. 生产了商品-11.
  23. 生产了商品-12.
  24. 生产了商品-13.
  25. 生产了商品-14.
  26. Alice 买了一个商品-10.
  27. Bob 买了一个商品-11.
  28. Alice没钱了,回家.
  29. Bob 买了一个商品-12.
  30. Bob 买了一个商品-13.
  31. Bob没钱了,回家.

这里会出现一种特殊情况,当消费者线程较多时会大量出现:

  1. 生产了商品-0.
  2. 生产了商品-1.
  3. 生产了商品-2.
  4. 生产了商品-3.
  5. 生产了商品-4.
  6. Bob 买了一个商品-0.
  7. Alice 买了一个商品-1.
  8. Bob 买了一个商品-2.
  9. Alice 买了一个商品-3.
  10. Bob 买了一个商品-4.
  11. 生产了商品-5. # !!!!!
  12. Alice 买了一个商品-5. # !!!!!
  13. 生产了商品-6.
  14. 生产了商品-7.
  15. 生产了商品-8.
  16. 生产了商品-9.
  17. Bob 买了一个商品-6.
  18. Alice 买了一个商品-7.
  19. Alice 买了一个商品-8.
  20. Bob 买了一个商品-9.
  21. 生产了商品-10.
  22. 生产了商品-11.
  23. 生产了商品-12.
  24. 生产了商品-13.
  25. 生产了商品-14.
  26. Alice 买了一个商品-10.
  27. Bob 买了一个商品-11.
  28. Bob 买了一个商品-12.
  29. Alice 买了一个商品-13.
  30. Bob没钱了,回家.
  31. Alice没钱了,回家.

这是因为生产者在轮询检查商品是否为空会有很小的延迟,在这个延迟中有消费者线程正好跑过了wait()方法,而阻塞在了商品获取这里(商品使用了队列,队列是线程安全的,当队列为空时,get()方法会阻塞),所以当生产者开始执行的时候,这个消费者因为商品队列里有数据就被立即唤醒了。

Python多线程-Event(事件对象)的更多相关文章

  1. trigger()的event事件对象之坑

    问题引入,先贴一段有问题的代码,如果你对 trigger()  这个函数了解不透彻,还真看不出这段代码错在哪.完成的功能是样式转换器,想让页面在加载后自行触发点击事件隐藏三个按钮,但是效果如图并没有隐 ...

  2. 简单总结焦点事件、Event事件对象、冒泡事件

    每学习一些新的东西,要学会复习,总结和记录. 今天来简单总结一下学到的几个事件:焦点事件.Event事件对象.冒泡事件 其实这几个事件应该往深的说是挺难的,但今天主要是以一个小菜的角度去尝试理解一些基 ...

  3. 第53天:鼠标事件、event事件对象

    -->鼠标事件-->event事件对象-->默认事件-->键盘事件(keyCode)-->拖拽效果 一.鼠标事件 onclick ---------------鼠标点击事 ...

  4. vue 笔记,ref 及 $event 事件对象

    本文仅用作简单记录 ref : 在标签上添加 ref = “name” ,表示获取当前元素节点 <input type="text" ref="info" ...

  5. event事件对象

    事件对象event: 在触发DOM事件的时候都会产生一个对象 1.type:获取事件类型 2.target:获取事件目标 3.stopPropagation():组织事件冒泡 4.preventDef ...

  6. event事件对象和clientX,clientY

    一.event : 事件对象 , 当一个事件发生的时候,和当前这个对象发生的这个事件有关的一些详细的信息都会被临时保存到一个指定地方-event对象,供我们在需要的调用.如:飞机-黑匣子 事件对象必须 ...

  7. jquery之event与originalEvent的关系、event事件对象用法浅析

    在jquery中,最终传入事件处理程序的 event 其实已经被 jQuery 做过标准化处理, 其原有的事件对象则被保存于 event 对象的 originalEvent 属性之中, 每个 even ...

  8. (转)内核线程对象--Event事件对象

    在所有的内核对象中,事件内核对象是个最基本的对象.事件能够通知一个操作已经完成. 客户机和一个服务器,它们之间需要互相进行通信例子(vs2008 ) 事件内核对象的组成 一个使用计数(与所有内核对象一 ...

  9. 【js】event(事件对象)详解

    1.事件对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 什么时候会产生Event 对象呢? 例如: 当用户单击某个元素的时候,我们给这个元 ...

随机推荐

  1. 重启服务器后,启动oracle监听报错 The listener supports no services The command completed successfuslly

    启动监听报错如下图所示: 远程连接报错如下图所示: 问题原因:数据库实例没注册到listener中 解决方法: (1)登录数据库:$sqlplus  / as sysdba (2)显示服务名:sql& ...

  2. RNN入门

    RNN入门学习 原文地址:http://blog.csdn.net/hjimce/article/details/49095371 作者:hjimce 一.相关理论 RNN(Recurrent Neu ...

  3. FPGA速度等级

    转自http://wenku.baidu.com/view/ea793deef8c75fbfc77db263.html?from=rec 最初接触speed grade这个概念时,很是为Altera的 ...

  4. 如何批量下载网站中的超链接(一次性下载网页中所有可能的PDF文件)

    最近公司在做工程项目,实现文件批量下载. 网上找了很久,发现网上的代码都有相似的问题,不过最终还是让我找到了一个符合的项目. 工程: 进行项目文件下载功能分析,弄清楚文件批量下载的原理,提供的数据支持 ...

  5. 安装mysql后必做的两件事

    1..删除掉不需要的用户 查看用户表mysql> SELECT User,Host FROM mysql.user; +------+-------------------------+ | U ...

  6. MIT molecular Biology 笔记10 翻译

    视频  https://www.bilibili.com/video/av7973580/ 教材 Molecular biology of the gene 7th edition  J.D. Wat ...

  7. (转)memcached的运行状态监控

    转自:http://hi.baidu.com/software_one/item/e7e2b5846ba28bcaef083df3 当memcached启动起来并被访问后,如何知道其详细运行情况呢,详 ...

  8. 图像像素转换 8-bit 16-bit 32-bit游戏效果

    https://www.ipcfun.com/8bit-you-xi-hua-mian-fu-yuan-3d-li-ti-tu.html https://bbs.csdn.net/wap/topics ...

  9. 20169207《Linux内核原理与分析》第九周作业

    第九周的实验依旧和往常的一样,主要包括两部分.一是1.阅读学习教材「Linux内核设计与实现 (Linux Kernel Development)」第教材第13,14章.二是学习MOOC「Linux内 ...

  10. python生成器实例

    生成器是一种特殊的迭代器,它有yield语句 #coding:utf-8def fibs(max): n,a,b = 0,0,1 while n < max: yield b a , b = b ...