python笔记11-多线程之Condition(条件变量)

前言

当小伙伴a在往火锅里面添加鱼丸,这个就是生产者行为;另外一个小伙伴b在吃掉鱼丸就是消费者行为。当火锅里面鱼丸达到一定数量加满后b才能吃,这就是一种条件判断了。

这就是本篇要讲的Condition(条件变量)

一、Condition

Condition(条件变量)通常与一个锁关联。需要在多个Contidion中共享一个锁时,可以传递一个Lock/RLock实例给构造方法,否则它将自己生成一个RLock实例。

可以认为,除了Lock带有的锁定池外,Condition还包含一个等待池,池中的线程处于状态图中的等待阻塞状态,直到另一个线程调用notify()/notifyAll()通知;得到通知后线程进入锁定池等待锁定。

Condition():

- acquire(): 线程锁

- release(): 释放锁

- wait(timeout): 线程挂起,直到收到一个notify通知或者超时(可选的,浮点数,单位是秒s)才会被唤醒继续运行。wait()必须在已获得Lock前提下才能调用,否则会触发RuntimeError。

- notify(n=1): 通知其他线程,那些挂起的线程接到这个通知之后会开始运行,默认是通知一个正等待该condition的线程,最多则唤醒n个等待的线程。notify()必须在已获得Lock前提下才能调用,否则会触发RuntimeError。notify()不会主动释放Lock。

- notifyAll(): 如果wait状态线程比较多,notifyAll的作用就是通知所有线程

二、 生产者与消费者

# coding=utf-8

import threading

import time

con = threading.Condition()

num = 0

# 生产者

class Producer(threading.Thread):

def __init__(self):

threading.Thread.__init__(self)

def run(self):

# 锁定线程

global num

con.acquire()

while num < 5:

print "开始添加!!!"

num += 1

print "火锅里面鱼丸个数:%s" % str(num)

time.sleep(1)

if num >= 5:

print "火锅里面里面鱼丸数量已经到达5个,无法添加了!"

# 唤醒等待的线程

con.notify() # 唤醒小伙伴开吃啦

# 释放锁

con.release()

# 消费者

class Consumers(threading.Thread):

def __init__(self):

threading.Thread.__init__(self)

def run(self):

con.acquire()

global num

while num > 0:

print "开始吃啦!!!"

num -= 1

print "火锅里面剩余鱼丸数量:%s" %str(num)

time.sleep(2)

if num <= 0:

print "锅底没货了,赶紧加鱼丸吧!"

con.wait()

con.release()

a = Producer()

b = Consumers()

a.start()

b.start()

运行结果:

开始添加!!!

火锅里面鱼丸个数:1

开始添加!!!

火锅里面鱼丸个数:2

开始添加!!!

火锅里面鱼丸个数:3

开始添加!!!

火锅里面鱼丸个数:4

开始添加!!!

火锅里面鱼丸个数:5

火锅里面里面鱼丸数量已经到达5个,无法添加了!

开始吃啦!!!

火锅里面剩余鱼丸数量:4

开始吃啦!!!

火锅里面剩余鱼丸数量:3

开始吃啦!!!

火锅里面剩余鱼丸数量:2

开始吃啦!!!

火锅里面剩余鱼丸数量:1

开始吃啦!!!

火锅里面剩余鱼丸数量:0

锅底没货了,赶紧加鱼丸吧!

原文发布于微信公众号 - 从零开始学自动化测试(yoyoketang)

原文发表时间:2018-01-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小程序·云开发专栏

小程序·云开发的云函数路由高级玩法

在掘金开发者大会上,在推荐实践那里,我有提到一种云函数的用法,我们可以将相同的一些操作。

8.8K12
来自专栏Java社区

Java核心技术讲解学习

1503
来自专栏瓜大三哥

UVM(七)之phase及objection

UVM(七)之phase及objection 这两个概念与UVM验证平台息息相关,phase就好比铁轨,让UVM这趟列车在铁轨上向前运行,不会脱轨,不...

4698
来自专栏我的博客

原生JavaScript第一天

首先:感谢李炎恢老师的无私奉献 其次:下面的学习总结都是根据李炎恢老师的视频以及参考网络资料编写,转载请注明出处:http://www.0377joyous.c...

2854
来自专栏SDNLAB

Ryu的一些设计方法解读

作为一个业余研究Ryu的软件工程师,一直惊叹于Ryu设计的优雅与简洁。一年多坚持下来,也有自己的一些收获,写出来和大家分享一下。 我们的故事从@set_ev_c...

3146
来自专栏技术记录

谈谈序列化—实体bean一定要实现Serializable接口?

导读:最近在做项目的过程中,发现一个问题,就是我们最开始的时候,传递参数包括返回类型,都有map类型。但是由于map每次都要匹配key值,很麻烦。所以在之后就将...

4158
来自专栏LuckQI

Java核心技术讲解学习

1392
来自专栏玄魂工作室

Python爬虫之urllib模块2

--------------------------------------------------------------------------------...

2905
来自专栏java一日一条

Java 元编程及其应用

同样是实现一个投票系统,一个是python程序员,基于django-framework,用了半小时就搭建了一个完整系统,另外一个是标准的SSM(Spring-S...

1801
来自专栏程序员的知识天地

用 Python 抓网页,你想问的都帮答好了,你还有不懂的吗?

近年来,随着大数据、人工智能、机器学习等技术的兴起,Python 语言也越来越为人们所喜爱。但早在这些技术普及之前,Python 就一直担负着一个重要的工作:自...

1373

扫码关注云+社区

领取腾讯云代金券