python条件变量之生产者与消费者操作实例分析
作者:聪明的狐狸 发布时间:2023-05-06 02:06:42
标签:python,条件变量,生产者,消费者
本文实例讲述了python条件变量之生产者与消费者操作。分享给大家供大家参考,具体如下:
互斥锁是最简单的线程同步机制,面对复杂线程同步问题,Python还提供了Condition对象。Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法。线程首先acquire一个条件变量,然后判断一些条件。如果条件不满足则wait;如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件。不断的重复这一过程,从而解决复杂的同步问题。
可以认为Condition对象维护了一个锁(Lock/RLock)和一个waiting池。线程通过acquire获得Condition对象,当调用wait方法时,线程会释放Condition内部的锁并进入blocked状态,(但实际上不会block当前线程)同时在waiting池中记录这个线程。当调用notify方法时,Condition对象会从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁。
Condition对象的构造函数可以接受一个Lock/RLock对象作为参数,如果没有指定,则Condition对象会在内部自行创建一个RLock。
线程同步经典问题----生产者与消费者问题可以使用条件变量轻松解决。
import threading
import time
class Producer(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
global count
while True:
con.acquire()
if count <20:
count += 1
print self.name," Producer product 1,current is %d" %(count)
con.notify()
else:
print self.name,"Producer say box is full"
con.wait()
con.release()
time.sleep(1)
class Consumer(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
global count
while True:
con.acquire()
if count>4:
count -=4
print self.name,"Consumer consume 4,current is %d" %(count)
con.notify()
else:
con.wait()
print self.name," Consumer say box is empty"
con.release()
time.sleep(1)
count = 0
con = threading.Condition()
def test():
for i in range(1):
a = Consumer()
a.start()
for i in range(1):
b =Producer()
b.start()
if __name__=='__main__':
test()
上面的代码假定消费者消费的比较快,输出结果为:
希望本文所述对大家Python程序设计有所帮助。
0
投稿
猜你喜欢
- 众所周知,Python使用pip方法安装第三方包时,需要从https://pypi.org/资源库中下载,但是会面临下载速度慢,甚至无法下载
- 例子是输出九九乘法表如果按照如下程序写:# 输出九九乘法表 for i in range(10): for j in range
- 有如下格式的文本文件/“/请/!/”/“/请/!/”/两名/剑士/各自/倒转/剑尖/,/右手/握/剑柄/,/左手/搭于/右手/手背/,/躬身
- 利用Python处理数据时,处理完成后输出结果为二维的列表,如果我们想把这个列表输出到Excel中形成格式化的数据,其实和输出到TXT文件大
- 创建新项目,及应用django-admin startproject myprojcd myprojpython manage.py sta
- Python自定义函数在Python编程中,可以使用已经定义好的函数,也可以自定义函数实现某些特殊的功能。自定义函数的语法在Python中,
- b.php的代码 <?php //只能通过post方式访问 if ($_SERVER['REQUEST_METHOD'
- 1.建立设计规范的意义 建立设计文档的根本目的
- 水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。本文将通过Python代码实现打印水仙花数,具体如
- 本文中介绍的主要是SQL语句,请大家不要在Access中使用。SQL的分类:DDL—数据定义语言(CREATE,ALTE
- 灵感来源之前在B站看到一个有意思的视频:【B站】【亦】终极云游戏!五千人同开一辆车,复现经典群体智慧实验大家可以看看,很有意思。up主通过代
- excel写入数据,使用openpyxl库class WriteExcel: def __init__(self,path):
- 前言保留小数位是我们经常会碰到的问题,尤其是刷题过程中。那么在python中保留小数位的方法也非常多,但是笔者的原则就是什么简单用什么,因此
- 在 Python 中,集合(set)是一种无序且不重复的集合类型,它是由花括号 {} 括起来的一组元素。如果你想向集合中添加一个元素,你可以
- 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的编写,刚开始不会体会出SQL语句各种写法的性能优劣,但是如果将应
- re正则表达式模块还包括一些有用的操作正则表达式的函数。下面主要介绍compile函数。 定义: compile(pattern[,flag
- 如下所示:解读: transpose( ) 方法的参数是一个 由 轴编号(轴编号自0 开始) 序列构成的 元组。开始时,数组的轴编号序列是默
- 问题:过滤用户输入中前后多余的空白字符‘ ++++abc123---
- 该章节将学习关于文件查找的操作,大家都知道,无论是 Linux 系统还是 Windows 系统都有基于文件名实现过滤、查找的功能。但是如果想
- 这篇文章主要介绍了如何基于python实现归一化处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友