孤荷凌寒自学python第四十二天python 的线程同步之Condition对象

(完整学习过程屏幕记录视频地址在文末,手写笔记在文末)

今天学习了Condition对象,发现它综合了Event对象与Lock对象的特点,在使用和功能上更为丰富。

得到Condition对象

新的Condition对象=threading. Condition ([Lock | RLock])

使用Condition对象之前,必须保证当前py文档已声明引用过threading模块:

import threading

可以为新的Condition对象传递一个Lock或RLock对象,这样的话,如果 存在多个Condition对象就可以共用一个Lock对象来操纵各个线程。如果 没有为新的Condition对象传递一个Lock或RLock对象,那么也没有关系,在Condition对象的内部会自动创建一个RLock对象来供自己使用。

Condition对象的主要方法

Condition对象有四个最常用的主要方法:

1

Condition对象 . acquire()

此方法直接传递给Condition对象的Lock对象使用,与Lock对象的作用一样,用于获取锁,并让并行的其它线程处于不执行状态,让当前 线程独占运行。

2

Condition对象 . release()

此方法也直接传递给Condition对象的Lock对象使用,与Lock对象的作用一样,用于释放对锁的锁定。

3

Condition对象 . notify()

必须在acquire方法执行之后才能执行此方法,否则 就会报错。

执行此方法后,会通知线程池中处于wait状态的其中一个线程,让它尝试获取锁并继续运行。

注意此方法并不自动释放锁,因此执行完此方法后,一般应当马上执行release方法。

4

Condition对象 . wait()

必须在acquire方法执行之后才能执行此方法,否则 就会报错。

执行此方法后,会将当前线程放入wait线程池中,也就是让当前 线程处于wait状态。

注意此方法并不自动释放锁,因此执行完此方法后,一般应当马上执行release方法。

将文件由两个线程反复同步写和读的实现由Condition对象来实现

代码如下:

import threading

from datetime import datetime

from time import sleep

strf='1.txt'

def read():

n=3

while n:

E.acquire()

with open(strf,'r',encoding='utf-8') as f:

lstA=f.readlines()

#读文件的时候,尽快将文件中的内容读取出来 ,就马上离开with语句块,使操作的文件尽快关闭。

# 意思就是说,不要在操作文件的with语句块中放太多语句,全要操作的文件处于独占打开模式,这会影响其它进程对同一文件的操作。

#sleep(1)

print('读取第' + str(n) + '次' + str(lstA)  + '\n')

E.notify()

E.wait()

E.release()

n-=1

def write():

n=3

while n:

E.acquire()

with open(strf,'w',encoding='utf-8') as f:

lstA=['写入','第' + str(n) + '次']

f.writelines(lstA)

#sleep(1)

print(str(lstA) + '\n')

E.notify()

E.wait()

E.release()

n-=1

def main():

tread=threading.Thread(target=read)

twrite=threading.Thread(target=write)

twrite.start()

tread.start()

twrite.join()

tread.join()

print('主线程结束。')

if __name__=='__main__':

E=threading.Condition()

main()

运行结果如下:

['写入', '第3次']

读取第3次['写入第3次']

['写入', '第2次']

读取第2次['写入第2次']

['写入', '第1次']

读取第1次['写入第1次']

主线程结束。

从结果中看出,三次写入是成功的,且读写交替进行,符合同步要求,且读写没有冲突。

只是程序在执行完成后却发生死锁,且我没有能够定位问题出在哪儿。恳请高人指点迷津。

四、Condition对象最好的用处是解决生产者和消费者针对 商品存放库存的操作。

下面是代码:

import threading

from time import sleep

c=0 #表示产品池中产品的数量,这个产品池最终只能装20个产品

d=threading.Condition()

class 生产者(threading.Thread):

def __init__(self):

threading.Thread.__init__(self)

def run(self):

global c

while True:

d.acquire()

if c<20 :

c+=1

print('生产者生产了1个产品放到池中,现在产品数量:' + str(c))

d.notify() #生产者生产完产品,提示消费者可以购买了

else:

#现在产品池c中已经有20个产品,就不要生产

print('生产者处于等待中。')

d.wait()

d.release()

sleep(1)

class 消费者(threading.Thread):

def __init__(self):

threading.Thread.__init__(self)

def run(self):

global c

while True:

d.acquire()

if c>=1 :

c-=1

print('消费者购买走了1个产品,现在产品数量 ' + str(c))

d.notify() #消费者购买走了产品,提示生产者产品池中数量 可以减少,看是否需要生产新产品

else:

#现在产品池c中一个产品都没有,消费者无法购买产品

print('消费者处于等待中。')

d.wait()

d.release()

sleep(1)

def main():

n=5

ss=[]

xx=[]

while n:

s=生产者()

ss.append(s)

s.start()

n-=1

n=3

while n:

x=消费者()

xx.append(x)

x.start()

n-=1

n=5

while n:

ss[n-1].join()

n-=1

n=3

while n:

xx[n-1].join()

n-=1

print('主线程结束。')

if __name__=='__main__':

main()

运行结果如下:(因为此程序会不停循环,因此下面只是部分执行结果)

生产者生产了1个产品放到池中,现在产品数量:1

生产者生产了1个产品放到池中,现在产品数量:2

生产者生产了1个产品放到池中,现在产品数量:3

生产者生产了1个产品放到池中,现在产品数量:4

生产者生产了1个产品放到池中,现在产品数量:5

消费者购买走了1个产品,现在产品数量 4

消费者购买走了1个产品,现在产品数量 3

消费者购买走了1个产品,现在产品数量 2

生产者生产了1个产品放到池中,现在产品数量:3

生产者生产了1个产品放到池中,现在产品数量:4

生产者生产了1个产品放到池中,现在产品数量:5

生产者生产了1个产品放到池中,现在产品数量:6

生产者生产了1个产品放到池中,现在产品数量:7

消费者购买走了1个产品,现在产品数量 6

消费者购买走了1个产品,现在产品数量 5

消费者购买走了1个产品,现在产品数量 4

生产者生产了1个产品放到池中,现在产品数量:5

消费者购买走了1个产品,现在产品数量 4

消费者购买走了1个产品,现在产品数量 3

生产者生产了1个产品放到池中,现在产品数量:4

生产者生产了1个产品放到池中,现在产品数量:5

生产者生产了1个产品放到池中,现在产品数量:6

生产者生产了1个产品放到池中,现在产品数量:7

消费者购买走了1个产品,现在产品数量 6

生产者生产了1个产品放到池中,现在产品数量:7

消费者购买走了1个产品,现在产品数量 6

消费者购买走了1个产品,现在产品数量 5

生产者生产了1个产品放到池中,现在产品数量:6

生产者生产了1个产品放到池中,现在产品数量:7

生产者生产了1个产品放到池中,现在产品数量:8

生产者生产了1个产品放到池中,现在产品数量:9

消费者购买走了1个产品,现在产品数量 8

生产者生产了1个产品放到池中,现在产品数量:9

消费者购买走了1个产品,现在产品数量 8

生产者生产了1个产品放到池中,现在产品数量:9

消费者购买走了1个产品,现在产品数量 8

生产者生产了1个产品放到池中,现在产品数量:9

生产者生产了1个产品放到池中,现在产品数量:10

生产者生产了1个产品放到池中,现在产品数量:11

消费者购买走了1个产品,现在产品数量 10

就是要学  社群  www.941xue.com/index.aspx

python线程同步condition_042孤荷凌寒自学python线程同步之Condition对象相关推荐

  1. python 优先级继承_孤荷凌寒自学python第二十二天python类的继承

    (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) python中定义的类可以继承自其它类,所谓继承的概念,我的理解 是,就是一个类B继承自类A,意味着类B的内部代码块中就算不写任何代码,类B仍然 ...

  2. 孤荷凌寒自学python第四十一天python的线程同步之Event对象

    孤荷凌寒自学python第四十一天python的线程同步之Event对象 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 鉴于Lock锁与RLock锁均宣告没有完全完成同步文件操作的问题,于是 ...

  3. 孤荷凌寒自学python第三十九天python 的线程锁Lock

    孤荷凌寒自学python第三十九天python的线程锁Lock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 当多个线程同时操作一个文件等需要同时操作某一对象的情况发生时,很有可能发生冲突, ...

  4. 孤荷凌寒自学python第三十八天初识python的线程控制

    孤荷凌寒自学python第三十八天初识python的线程控制 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.线程 在操作系统中存在着很多的可执行的应用程序,每个应用程序启动后,就可以看着 ...

  5. 孤荷凌寒自学python第六天 列表的嵌套与列表的主要方法

    孤荷凌寒自学python第六天 列表的嵌套与列表的主要方法 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) (同步的语音笔记朗读:https://www.ximalaya.com/keji/1 ...

  6. 孤荷凌寒自学python第八十一天学习爬取图片1

    孤荷凌寒自学python第八十一天学习爬取图片1 (完整学习过程屏幕记录视频地址在文末) 通过前面十天的学习,我已经基本了解了通过requests模块来与网站服务器进行交互的方法,也知道了Beauti ...

  7. 孤荷凌寒自学python第五十四天使用python来删除Firebase数据库中的文档

    孤荷凌寒自学python第五十四天使用python来删除Firebase数据库中的文档 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数据库 ...

  8. python 保存文件 吃内存_孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化...

    孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.什么是序列化与反序列化 序列化是指将内存中的数据进行指 ...

  9. 孤荷凌寒自学python第六十三天学习mongoDB的基本操作并进行简单封装2

    孤荷凌寒自学python第六十三天学习mongoDB的基本操作并进行简单封装2 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第九天. 今天继续学习mongoDB的简单操作, ...

最新文章

  1. php数组函数及用法,php数组函数 in_array 的用法及注意事项
  2. c 语言中unsigned char类型变量占用内存大小,C数据类型
  3. c++协程1 (boost::coroutine)
  4. 微服务和Java EE
  5. mysql语句添加索引
  6. Codeforces Round #277(Div 2) A、B、C、D、E题解
  7. 我的一篇思想汇报——君子务本,本立而道生
  8. 获取客户端ip_获取客户端访问真实IP
  9. oracle清空回收站指定表,清空Oracle 10g回收站中以BIN$开头的表
  10. 【论文】本体匹配实体对齐知识融合入门论文推荐
  11. Tensorflow:variable变量和变量空间
  12. Premiere Pro 2022安装教程(附详细图文教程)
  13. 数据结构与算法学习笔记——数据结构(四):单向环形链表(约瑟夫问题)
  14. win10系统让图片打开方式为照片查看器
  15. 直接获得TP-LINK路由器外网IP地址
  16. D. Fixed Point Guessing
  17. 生成好看的海底地形图
  18. 2022年流动式起重机司机考试题库模拟考试平台操作
  19. Win10:快捷键整理,嗖嗖地办公
  20. 迅雷BT种子制作方法

热门文章

  1. 中国无创放射外科手术机器人行业市场供需与战略研究报告
  2. day_01HTML
  3. 怀旧服服务器怎么调整显卡性能,win10系统怎么让显卡性能最大化 提升显卡性能的设置步骤...
  4. 【英语】一个公式搞定时间介词
  5. 智慧健康服务平台解决方案
  6. Java Web实验程序设计——图书借阅网站的实现——图书信息
  7. 边缘计算顶会SEC 2019论文速览(一)
  8. PAT (Basic Level) 1027 打印沙漏 (20 point(s))
  9. body html 分别指什么,body表示什么
  10. 武昌首义学院计算机中心,武昌首义学院_新闻中心