使用condition对象

使用condition对象

'''
使用condition对象可以在触发某些事件之后才处理数据或者执行特定的功能,可以用于不同线程之间的通信或者通知,以实现更高级别的同步
案例:生产者与消费者共享一个列表,列表最大长度10,生产者负责在列表末尾添加元素,消费者负责获取首位元素并删除,如果达到最大长度,生产者等待,如果列表为空,则消费者等待
'''
import threading
from random import randint
from time import sleep
#自定义生产者类
class producer(threading.Thread):
    def __init__(self,name):
        threading.Thread.__init__(self,name=name)
    #重写run方法
    def run(self):
        global x
        while True:
            #获取锁
            con.acquire()
            if len(x) >= 10:
                #如果列表已满,则生产者等待
                con.wait()
                print('Producer is waiting...')
            else:
                print('Producer:',end=' ')
                #产生新元素
                x.append(randint(1,100))
                print(x)
                sleep(1)
                #唤醒等待条件的线程
                con.notify()
            #释放锁
            con.release()
#自定义消费者类
class consumer(threading.Thread):
    def __init__(self,name):
        threading.Thread.__init__(self,name=name)
    #重写run方法
    def run(self):
        global x
        while True:
            #获取锁
            con.acquire()
            if not x:
                #等待
                con.wait()
                print('Consumer is waiting...')
            else:
                print('消费元素:%d' % x.pop(0))
                print(x)
                sleep(2)
                con.notify()
            con.release()
#创建condition对象
con = threading.Condition()
x= []
p = producer('producer')
c = consumer('consumer')
p.start()
c.start()
p.join()
c.join()


Producer: [62]
Producer: [62, 92]
Producer: [62, 92, 38]
Producer: [62, 92, 38, 70]
Producer: [62, 92, 38, 70, 77]
Producer: [62, 92, 38, 70, 77, 83]
Producer: [62, 92, 38, 70, 77, 83, 81]
Producer: [62, 92, 38, 70, 77, 83, 81, 64]
Producer: [62, 92, 38, 70, 77, 83, 81, 64, 42]
Producer: [62, 92, 38, 70, 77, 83, 81, 64, 42, 100]
消费元素:62
[92, 38, 70, 77, 83, 81, 64, 42, 100]
消费元素:92
[38, 70, 77, 83, 81, 64, 42, 100]
消费元素:38
[70, 77, 83, 81, 64, 42, 100]
消费元素:70
[77, 83, 81, 64, 42, 100]
消费元素:77
[83, 81, 64, 42, 100]
消费元素:83
[81, 64, 42, 100]
Producer is waiting...
Producer: [81, 64, 42, 100, 54]
Producer: [81, 64, 42, 100, 54, 7]
Producer: [81, 64, 42, 100, 54, 7, 96]
Producer: [81, 64, 42, 100, 54, 7, 96, 27]
消费元素:81
[64, 42, 100, 54, 7, 96, 27]
消费元素:64
[42, 100, 54, 7, 96, 27]
消费元素:42
[100, 54, 7, 96, 27]
Producer: [100, 54, 7, 96, 27, 63]
Producer: [100, 54, 7, 96, 27, 63, 9]
Producer: [100, 54, 7, 96, 27, 63, 9, 44]
Producer: [100, 54, 7, 96, 27, 63, 9, 44, 56]
Producer: [100, 54, 7, 96, 27, 63, 9, 44, 56, 81]
消费元素:100
[54, 7, 96, 27, 63, 9, 44, 56, 81]
消费元素:54
[7, 96, 27, 63, 9, 44, 56, 81]
消费元素:7


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值