Condition的处理流程如下:

首先acquire一个条件变量,然后判断一些条件。

如果条件不满足则wait;

如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件。

不断的重复这一过程,从而解决复杂的同步问题。

Condition的基本原理如下:

可以认为Condition对象维护了一个锁(Lock/RLock)和一个waiting池。线程通过acquire获得Condition对象,当调用wait方法时,线程会释放Condition内部的锁并进入blocked状态,同时在waiting池中记录这个线程。当调用notify方法时,Condition对象会从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁。

Condition对象的构造函数可以接受一个Lock/RLock对象作为参数,如果没有指定,则Condition对象会在内部自行创建一个RLock。

除了notify方法外,Condition对象还提供了notifyAll方法,可以通知waiting池中的所有线程尝试acquire内部锁。由于上述机制,处于waiting状态的线程只能通过notify方法唤醒,所以notifyAll的作用在于防止有的线程永远处于沉默状态。

演示条件变量同步的经典问题是生产者与消费者问题:假设有一群生产者(Producer)和一群消费者(Consumer)通过一个市场来交互产品。生产者的”策略“是如果市场上剩余的产品少于1000个,那么就生产100个产品放到市场上;而消费者的”策略“是如果市场上剩余产品的数量多余100个,那么就消费3个产品。用Condition解决生产者与消费者问题的代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

# -*- coding: utf-8 -*-

"""

Created on Wed Nov 28 17:15:29 2018

@author: 18665

"""

import threading

import time

class Producer(threading.Thread):

# 生产者函数

def run(self):

global count

while True:

if con.acquire():

# 当count 小于等于1000 的时候进行生产

if count >1000:

con.wait()

else:

count= count+100

msg= self.name+' produce 100, count=' + str(count)

print(msg)

# 完成生成后唤醒waiting状态的线程,

# 从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁

con.notify()

con.release()

time.sleep(1)

class Consumer(threading.Thread):

# 消费者函数

def run(self):

global count

while True:

# 当count 大于等于100的时候进行消费

if con.acquire():

if count <100:

con.wait()

else:

count= count-5

msg= self.name+' consume 5, count='+str(count)

print(msg)

con.notify()

# 完成生成后唤醒waiting状态的线程,

# 从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁

con.release()

time.sleep(1)

count= 500

con= threading.Condition()

def test():

for iin range(2):

p= Producer()

p.start()

for iin range(5):

c= Consumer()

c.start()

if __name__== '__main__':

test()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/lincappu/p/12695554.html

python执行过程_Python threading模块condition原理及运行流程详解相关推荐

  1. python threading condition使用_Python threading模块condition原理及运行流程详解

    Condition的处理流程如下: 首先acquire一个条件变量,然后判断一些条件. 如果条件不满足则wait: 如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wa ...

  2. Python标准库threading模块Condition原理浅析

    Python标准库threading模块Condition原理浅析 本文环境python3.5.2 threading模块Condition的实现思路 在Python的多线程实现过程中,在Linux平 ...

  3. python process 函数_Python Process创建进程的2种方法详解

    前面介绍了使用 os.fork() 函数实现多进程编程,该方法最明显的缺陷就是不适用于 Windows 系统.本节将介绍一种支持 Python 在 Windows 平台上创建新进程的方法. Pytho ...

  4. python sqlsever 时间_Python sqlalchemy时间戳及密码管理实现代码详解

    一.时间戳 实际开发中,我们一般希望create_time和update_time这两个属性能自动设置,所以在建表的时候需要在model上特殊处理一下: from sqlalchemy.sql imp ...

  5. python内存池_python内存监控工具memory_profiler和guppy的用法详解

    python内存监控工具memory_profiler和guppy的用法详解 发布时间:2020-08-21 19:44:58 来源:脚本之家 阅读:123 python2.7在内存管理上相比pyth ...

  6. python 元组拆包_Python元组拆包和具名元组解析实例详解

    前言 在Python中元组是一个相较于其他语言比较特别的一个内置序列类型.有些python入门教程把元组成为"不可变的列表",这种说法是不完备的,其并没有完整的概括元组的特点.除了 ...

  7. python比例图_python在地图上画比例的实例详解

    现在用python画图已经难不倒一直跟小编学习的小伙伴们了,甚至有的小伙伴画图比小编还要厉害.为此小编还偷偷下了一番功夫,画图这种事情,细节上的完善肯定能让图片更加好看.所以小编知道大家会画地图,但是 ...

  8. python hook 微信_python实现微信跳一跳辅助工具步骤详解

    说明 1.windows上安装安卓模拟器,安卓版本5.1以上 2.模拟器里下载安装最新的微信6.6.1 3.最好使用python2.7,python3的pyhook包有bug,解决比较麻烦 步骤 1. ...

  9. python zipfile教程_Python模块zipfile原理及使用方法详解

    zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率也是比较高的 zipfile里有两个非常重要的class, 分别是ZipFile和Zi ...

最新文章

  1. python 读取音频文件(mp3,wav)时间的两种方法
  2. matlab库存点仿真教程,基于MATLABSimulink库存系统建模与仿真.doc
  3. 计算机选配 注意事项,选择鼠标注意事项有哪些
  4. php kindeditor,在PHP使用kindeditor
  5. 冰点还原精灵是怎么用的
  6. 微信发ascii_微信翻译竟能识别神秘代码!这里有份超全的彩蛋总结 | 晓技巧
  7. android屏幕操作提示音,快捷指令库提示音
  8. C# 读取Word文本框中的文本、图片和表格(附VB.NET代码)
  9. 华硕电脑锁定计算机,华硕笔记本电脑的BIOS怎么设置
  10. 冒烟测试 SMOKE Test
  11. 一键检测Linux VPS/服务器配置、IO、国内节点下载测速
  12. Android开发—简单的图片浏览器
  13. 元宇宙代表人类的倒退
  14. 经纬度5位数和6位数差多少_各大在线地图,使用的经纬度坐标为什么都精确到小数点之后第六位...
  15. 18年2月份股市大跌感想
  16. st7789 320*240 显示屏,uboot驱动移植笔记
  17. 机器学习实战2:关联规则:议会投票+毒蘑菇
  18. 一文了解多肽的二硫键修饰(KLT,BSA,OVA偶联多肽,生物素及FAM、FITC、TAMRA、Bodipy、Cy5、Cy7修饰标记多肽)
  19. 微信小程序 实现阿里云上传
  20. java tasklist_java 调用 cmd 中的 tasklist 来获取特定进程的PID

热门文章

  1. 从入门到入土:基于Python|ACK|FIN|Null|Xmas|windows|扫描|端口扫描|scapy库编写|icmp协议探测主机|对开放端口和非开放端口完成半连接扫描|全连接扫描|
  2. 火山引擎对外开放推荐算法等字节跳动核心技术
  3. Aqara 2021发布会:万物互联的家庭智慧全景
  4. 大龄开发者正在消失?NO,听听这3位50岁程序员怎么说
  5. 小米否认“造车”;微软中国回应关闭实体直营店;Angular 10 发布 | 极客头条...
  6. 程序员风光背后:从零到BAT数据分析师靠的是什么?
  7. 漫画:什么是红黑树?(下篇)
  8. CSDN 联合 18 家大厂招聘直播,10 小时突破百万热度!
  9. 我是如何在六个月内学会 Python 的?
  10. 线上四台机器同一时间全部 OOM,到底发生了什么?