资讯专栏INFORMATION COLUMN

Condition 实现消费者生产者

hightopo / 3174人阅读

摘要:生产生成数据,通知消费者现在条数生产者判断现在含有的数据大于不需要再生产消费者无法消费到数据,处于等待状态消费数据

# -*- coding:utf-8 -*-
""" Created by FizLin
     https://github.com/Fiz1994
"""

# Consume one item
# with cv:
#     while not an_item_is_available():
#         cv.wait()
#     get_an_available_item()
#
# # Produce one item
# with cv:
#     make_an_item_available()
#     cv.notify()


from threading import Thread, Condition
import time

queue = []
MAX_NUM = 10
condition = Condition()

def producer():
    global queue
    while True:
        condition.acquire()
        if len(queue) <= 0:
            # 生产
            queue.extend([i for i in range(10)])
            print("生成数据,通知消费者 现在条数:", len(queue))
            condition.notify()
            condition.wait()
        else:
            print("生产者判断现在含有的数据: 大于0 不需要再生产", len(queue))
            condition.notify()

        condition.release()
        time.sleep(1)


def consumer():
    global queue
    while True:
        condition.acquire()
        if len(queue) <= 0:
            print("消费者无法消费到数据,处于等待状态")
            condition.wait()
        else:
            print("消费数据:", queue.pop(0))
            time.sleep(1)
            condition.notify()
        condition.release()




p = Thread(target=producer)
c = Thread(target=consumer)
p.start()
c.start()


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40657.html

相关文章

  • Java基础学习——多线程(线程间通信-生产消费代码示例)

    摘要:提供了多线程升级方案将同步替换成了显示的操作。线程间通信接口可以替代传统的线程间通信,用替换,用替换,用替换。商品执行上述代码,观察结果可以看到,多个线程同时生产消费,由于指定唤醒互异线程,因此并不会引起错误。 JDK 1.5提供了多线程升级方案将同步synchronized替换成了显示的Lock操作。可以实现唤醒、冻结指定的线程。 Lock接口Lock 实现提供了比使用 synchr...

    FuisonDesign 评论0 收藏0
  • BlockingQueue与Condition原理解析

    摘要:最后一直调用函数判断节点是否被转移到队列上,也就是中等待获取锁的队列。这样的话,函数中调用函数就会返回,导致函数进入最后一步重新获取锁的状态。函数其实就做了一件事情,就是不断尝试调用函数,将队首的一个节点转移到队列中,直到转移成功。  我在前段时间写了一篇关于AQS源码解析的文章AbstractQueuedSynchronizer超详细原理解析,在文章里边我说JUC包中的大部分多线程相...

    TalkingData 评论0 收藏0
  • AbstractQueuedSynchronizer理解之四(Condition

    摘要:总结在一开是的例子中,假设有两个线程,分别代表生产者和消费者线程,生产消费元素的队列容量为。 什么是Condition Condition必须要和独占锁一起使用,独占锁代替了原来的synchronized,Condition代替了原来的Object中的监视器方法(wait, notify and notifyAll);一个Lock可以对应多个Condition,这样线程之间可以按照条件...

    RiverLi 评论0 收藏0
  • AbstractQueuedSynchronizer理解之四(Condition

    摘要:总结在一开是的例子中,假设有两个线程,分别代表生产者和消费者线程,生产消费元素的队列容量为。 什么是Condition Condition必须要和独占锁一起使用,独占锁代替了原来的synchronized,Condition代替了原来的Object中的监视器方法(wait, notify and notifyAll);一个Lock可以对应多个Condition,这样线程之间可以按照条件...

    leiyi 评论0 收藏0
  • 从0到1实现自己的阻塞队列(下)

    摘要:在上一篇文章从到实现自己的阻塞队列上中,我们已经实现了一个可以使用的阻塞队列版本。插入锁队列未满的条件变量弹出锁队列非空的条件变量最后我们要对和方法中的调用做出一些调整。 在上一篇文章《从0到1实现自己的阻塞队列(上)》中,我们已经实现了一个可以使用的阻塞队列版本。在这篇文章中,我们可以继续我们的冒险之旅,将我们的阻塞队列提升到接近JDK版本的水平上。 更进一步优化效率 我们一直使用的...

    XFLY 评论0 收藏0

发表评论

0条评论

hightopo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<