首页 > 编程语言 >Python使用Condition对象实现多线程同步

Python使用Condition对象实现多线程同步

时间:2023-06-09 20:07:21浏览次数:42  
标签:Python Consumed waiting ..... 线程 多线程 Condition con


使用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,Consumed,waiting,.....,线程,多线程,Condition,con
From: https://blog.51cto.com/u_9653244/6450953

相关文章

  • 使用Python开发会聊天的智能小机器人
    本文重点演示使用socket实现TCP通信以及字典和集合的用法,客户端发来信息之后,服务端会尽量猜测客户端要表达的真正意思,然后选择合适的内容进行回复。服务端小机器人代码:importsocketfromos.pathimportcommonprefixwords={'howareyou?':'Fine,thankyou.','howo......
  • Python字符串处理小案例
    连续5天30个小时的Python培训圆满结束,明天早上5点半出发赶飞机回烟台,晚上收拾行李的时候突然想起来20年前做过的一个C语言题目:假设有一个字符串,里面有若干字母o。要求如下:从前到后扫描,把每个字符删除并追加至字符串尾部,如果遇到字母o就删除,直至字符串处理结束。本文代码主要演示字......
  • Python版归并排序算法(附Python程序__name__属性用法演示视频)
    importrandomdefmergeSort(seq,reverse=False):#把原列表分成两部分mid=len(seq)//2left,right=seq[:mid],seq[mid:]#根据需要进行递归iflen(left)>1:left=mergeSort(left)iflen(right)>1:right=mergeS......
  • 使用Python读写文本文件内容
    本文主要演示如何读写文本文件的内容,以及上下文管理语句with的用法。使用上下文管理语句with时,即使在操作文件内容时引发异常也能保证文件被正确关闭。#'w'表示写入文件,默认为文本文件#如果文件test1.txt不存在,就创建#如果文件test1.txt已存在,就覆盖withopen('test1.txt','w')......
  • Python+pillow计算椭圆图形几何中心
    本文所用测试图像文件位于当前文件夹的testimages子文件夹中,并且图像以白色为背景。fromPILimportImageimportosdefsearchLeft(width,height,im):#从左向右扫描forwinrange(width):#从下向上扫描forhinrange(height):#获......
  • Python使用RSA+MD5实现数字签名
    数字签名主要有防抵赖和防篡改两种功能:一是能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名,二是能确定消息的完整性。作为具体实现,发送报文时,发送方用一个哈希函数(例如MD5、SHA-1、SHA-256、SHA-384或SHA-512)从报文文本中生成报文摘要,然后用自己的私钥(由RSA......
  • Python+tensorflow计算整数阶乘的方法与局限性
    本文代码主要演示tensorflow的基本用法。importtensorflowas#创建变量,保存计算结果start=tf.Variable(1,dtype=tf.int64)#初始化变量的opinit_op=tf.global_variables_initializer()#启用默认图withtf.Session()assess:#初始化变量sess.run(ini......
  • Python使用scipy进行多项式计算与符号计算
    本文代码主要演示如何使用poly1d进行多项式计算和符号计算。fromscipyimport>>>p1=poly1d([1,2,3,4])#输出结果中,第一行的数字为第二行对应位置项中x的指数>>>print(p1)321x+2x+3x+4#等价于p2=(x-1)(x-2)(x-3)(x-4)>>>p2=poly1d([1,2,3......
  • Python中else关键字的常见用法
    Python中的else常见用法有三:选择结构、循环结构和异常处理结构。(1)选择结构这应该是最常见的用法,与关键字if和elif组合来使用,用来说明条件不符合时应执行的代码块。(2)循环结构Python中的for循环和while循环都可以带else子句,如果循环是因为条件不再成立而自然结束时会执行else中的代码......
  • Python实现字符串与指定密钥循环异或加解密
    异或运算在很多密码学算法中都有不同程度的应用,其运算特定在于一个数和另一个数连续异或两次仍得到原来的数。在实际使用中,因为要加密的信息和所使用的密钥在大多数情况下是不等长的,所以经常需要循环使用密钥。defcrypt1(source,key):'''source是要加密或解密的字符串,key是......