使用Condition对象可以在某些事件触发后才处理数据或执行特定的功能代码,可以用于不同线程之间的通信或通知,以实现更高级别的同步。在内部实现上,Condition对象总是与某种锁对象相关联。

Condition对象除了具有acquire()和release()方法之外,还有wait()、wait_for()、notify()、notify_all()等方法:

  • wait(timeout=None)方法会释放锁,并阻塞当前线程直到超时或其他线程针对同一个Condition对象调用了notify()/notify_all()方法,被唤醒之后当前线程会重新尝试获取锁并在成功获取锁之后结束wait()方法,然后继续执行;

  • wait_for(predicate, timeout=None)方法阻塞当前线程直到超时或者指定条件得到满足;

  • notify(n=1)唤醒等待该Condition对象的一个或多个线程,该方法并不负责释放锁;

  • notify_all()方法会唤醒等待该Condition对象的所有线程。

本文代码模拟了经典的生产者-消费者问题,使用列表模拟物品池,生产者往里放物品,消费者从中获取物品,物品池满时生产者等待,空时消费者等待。

import threading

from random import randint

from time import sleep

#自定义生产者线程类

class Producer(threading.Thread):

def __init__(self, threadname):

threading.Thread.__init__(self,name=threadname)

def run(self):

global x

while True:

sleep(1)

#获取锁

con.acquire()

#假设共享列表中最多能容纳5个元素

if len(x) == 5:

#如果共享列表已满,生产者等待

print('Producer is waiting.....')

con.wait()

else:

r = randint(1, 1000)

print('Produced:', r)

#产生新元素,添加至共享列表

x.append(r)

#唤醒等待条件的线程

con.notify()

#释放锁

con.release()

#自定义消费者线程类

class Consumer(threading.Thread):

def __init__(self, threadname):

threading.Thread.__init__(self, name =threadname)

def run(self):

global x

while True:

sleep(2)

#获取锁

con.acquire()

if not x:

#等待

print('Consumer is waiting.....')

con.wait()

else:

print('Consumed:', x.pop(0))

con.notify()

con.release()

#创建Condition对象以及生产者线程和消费者线程

con = threading.Condition()

x = []

Producer('Producer').start()

Consumer('Consumer').start()

某次运行部分结果如下

Produced: 696

Produced: 970

Consumed: 696

Produced: 546

Produced: 30

Consumed: 970

Produced: 824

Produced: 68

Consumed: 546

Produced: 409

Produced: 172

Consumed: 30

Produced: 820

Producer is waiting.....

Consumed: 824

Produced: 2

Producer is waiting.....

Consumed: 68

Produced: 473

Producer is waiting.....

Consumed: 409

Produced: 167

Consumed: 172

Produced: 192

Producer is waiting.....

Consumed: 820

Produced: 789

Consumed: 2

Produced: 855

Producer is waiting.....

Consumed: 473

Produced: 754

Producer is waiting.....

Consumed: 167

Produced: 549

Consumed: 192

Produced: 100

Producer is waiting.....

Consumed: 789

Produced: 862

Consumed: 855

Produced: 537

Producer is waiting.....

Consumed: 754

Produced: 715

Consumed: 549

Produced: 79

Producer is waiting.....

Consumed: 100

Produced: 445

Consumed: 862

Produced: 64

Producer is waiting.....

Consumed: 537

Produced: 755

Consumed: 715

Produced: 8

^C(按Crtl+Break退出)

Python使用Condition对象实现多线程同步相关推荐

  1. 微课|Python使用Barrier对象实现多线程同步

    中国大学MOOC"Python程序设计基础"第5次开课 推荐教材: <Python网络程序设计(微课版)>,ISBN:978-7-3025-8312-7,董付国,清华大 ...

  2. Python使用Queue对象实现多线程同步小案例

    queue模块的Queue对象实现了多生产者/多消费者队列,尤其适合需要在多个线程之间进行信息交换的场合,实现了多线程编程所需要的所有锁语义. Queue对象主要实现了put()和get()方法,分别 ...

  3. Python并行编程(四):多线程同步之condition(条件变量)实现带有缓冲区的生产者-消费者模型...

    什么是Condtion? 所谓condition条件变量,即这种机制是在满足了特定的条件后,线程才可以访问相关的数据. 这种同步机制就是一个线程等待特定的条件,另一个线程通知它条件已经发生.一旦条件发 ...

  4. Python使用BoundedSemaphore对象进行线程同步

    Semaphore对象维护着一个内部计数器,调用acquire()方法时该计数器减1,调用release()方法时该计数器加1,适用于需要控制特定资源的并发访问线程数量的场合. 调用acquire() ...

  5. 【转】windows平台多线程同步之Mutex的应用

    线程组成: 线程的内核对象,操作系统用来管理该线程的数据结构. 线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量.   操作系统为每一个运行线程安排一定的CPU时间 -- 时间片.系统通过 ...

  6. C++实现多线程及其三种方法实现多线程同步

    1.调用windows API实现多线程 #include "stdafx.h" #include <windows.h> #include <stdio.h&g ...

  7. python线程同步condition_042孤荷凌寒自学python线程同步之Condition对象

    孤荷凌寒自学python第四十二天python 的线程同步之Condition对象 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天学习了Condition对象,发现它综合了Event对象 ...

  8. python类库32[多线程同步Lock+RLock+Semaphore+Event]

    2019独角兽企业重金招聘Python工程师标准>>> 一 多线程同步 由于CPython的python解释器在单线程模式下执行,所以导致python的多线程在很多的时候并不能很好地 ...

  9. python线程安全的计数器_Python多线程同步Lock、RLock、Semaphore、Event实例

    一.多线程同步 由于CPython的python解释器在单线程模式下执行,所以导致python的多线程在很多的时候并不能很好地发挥多核cpu的资源.大部分情况都推荐使用多进程. python的多线程的 ...

最新文章

  1. 二分法典例:木棒切割问题
  2. 如何自己写一个公用的NPM包
  3. java控制结构_java控制结构WORD
  4. C#编程规范--控件命名篇[转]
  5. node n 切换node版本失败_node版本如何升级
  6. 计算机专业博士在体制内做啥工作,体制内裸辞,三十多岁大龄考博,我收获了什么?...
  7. 用SSAS将多个FLV和MP3合成一个FLV文件
  8. Oracle RMAN完全恢复案例(二)
  9. sqldr load 以及extract data 的中文问题--
  10. 关于STM8S003f3p6的定时器2通道3无法输出pwm的问题
  11. python自动排版公众号_GitHub - Pidbid/maxpress: MaxPress:MarkDown+Python实现微信公众号一键排版...
  12. VSEARCH:最简单易学的扩增子分析流程
  13. Linux下的常用软件集锦
  14. shiro学习详解(开篇)
  15. Unity3D本地文件夹的创建、删除(Directory文件夹删除和单个文件删除)
  16. 自动化玩腾讯微证券领长牛python实现---学习记录
  17. tiktok海外抖音发视频0播放怎么办?
  18. 字符串为null 和 字符串长度为0
  19. 前端开发行业真的会被AI取代吗?
  20. 动漫培训网课学费需要多少钱

热门文章

  1. linux运维企业shell,shell脚本-企业日常巡检脚本
  2. sparksql 操作hive_三十六、图解SparkSQL运行原理
  3. python flask 分页前后端分离_【flask + vue 前后端分离博客】创建第一个 Flask RESTFul(一)...
  4. 微服务 mysql 连接池_【mysql】druid,连接池和微服务的问题
  5. qmenu基本用法_使用QProxyStyle定制QMenu (二)
  6. mysql修改内置函数,Mysql常见内置函数
  7. Maven知识点记录 - profile
  8. 心理软件测试自学,软件测试中的心理学
  9. kodi资源_kodi.tv让你从此看4K节目可以更多选择
  10. 10个性鼠标指针主题包_游戏鼠标推荐