博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python线程同步condition_PYTHON线程知识再研习E---条件变量同步Condition-阿里云开发者社区...
阅读量:4987 次
发布时间:2019-06-12

本文共 1366 字,大约阅读时间需要 4 分钟。

Python提供的Condition对象提供了对复杂线程同步问题的支持。Condition被称为条件变量,除了提供与Lock类似的 acquire和release方法外,还提供了wait和notify方法。线程首先acquire一个条件变量,然后判断一些条件。如果条件不满足则 wait;如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件。不断的重复 这一过程,从而解决复杂的同步问题。

可以认为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的作用在于防止有线程永远处于沉默状态。

#!/usr/bin/env python#-*- coding: utf-8 -*-

import threading

import time

class Producer(threading.Thread):

def run(self):

global count

while True:

if con.acquire():

if count > 1000:

con.wait()

else:

count += 100

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

print msg

con.notify()

con.release()

time.sleep(1)

class Consumer(threading.Thread):

def run(self):

global count

while True:

if con.acquire():

if count < 100:

con.wait()

else:

count -= 3

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

print msg

con.notify()

con.release()

time.sleep(1)

count = 500

con =threading.Condition()

def test():

for i in range(2):

p = Producer()

p.start()

for i in range(5):

c = Consumer()

c.start()

if __name__ == '__main__':

test()

转载地址:http://dqnrp.baihongyu.com/

你可能感兴趣的文章
[LeetCode] 342. Power of Four 4的次方数
查看>>
with上下文管理器
查看>>
MySQL中 如何查询表名中包含某字段的表 ,查询MySql数据库架构信息:数据库,表,表字段...
查看>>
03-position和anchorPoint
查看>>
windows 下 nginx 的启动 停止 关闭
查看>>
Django 数据表更改
查看>>
java io读写文件
查看>>
【智能算法】粒子群寻优算法
查看>>
生活中一面,网上另一面
查看>>
[TensorFlow]TensorFlow安装方法
查看>>
机器学习实战-----八大分类器识别树叶带源码
查看>>
springMVC国际化配置和使用
查看>>
centos7下SVN服务器如何搭建
查看>>
CSS自学笔记(11):CSS3背景和边框
查看>>
EL表达式 (详解)
查看>>
重载和重写的区别
查看>>
跟我一起读postgresql源码(十二)——Executor(查询执行模块之——Materialization节点(下))...
查看>>
发音篇-第三章 自然发音法
查看>>
js计算滚动条高度及窗口高度
查看>>
这篇 感觉很实用--DJANGO ORM
查看>>