• 多线程Condition版的生戸者与消費者模式


    Lock版本的生产者与消费者模式可以正常的进行。但是存在一一个不足,在消费者中,总是通过while True 死循环并且上锁的方式去判断钱够不够,上锁是一种很耗费CPU的行为,.因此这种方式不是最好的.还有一种更好的方式便是使

    用threading.Condition 来实现。· threading.Conditton 可以在没有数据的吋候处于阻塞等待状态。一旦有合适的数据了,还可以使用notity相关的函数来通知其他处于等待状态的线程。这样就可以不用做一些无用的上锁和解锁的操作,可以提高程序的性能。

    首先対tmrecing.condition相美的注動霰个か紹,threading.Condition类似于threading.Lock ,可以在修改全局数据的吋候进行上锁,也可以在修改完毕后进行解锁。以下将一-些常用的函数进行筒単的介紹:

    1. acquire:上锁。

    2. release :解锁。

    3. wait :将当前线程处于等待状态,并且会释放锁。可以接其他线程使用notify和notify_all函数唤醒,被唤醒后会继续等待上锁,上锁后会继续执行 下面的代码

    4. notify : 通知某个正在等待的线程,默认是第一个等待的线程。

    5. notify_all :通知所有正在等待的线程。

    注意:notify和notify_all不会释放锁,并且需要在release之前使用。

    示例代码如下:

    #encoding: utf-8
    import threading

    import random
    import time

    gMoney = 1000
    gCondition = threading.Condition()

    gTotalTimes = 10
    gTimes = 0

    class Producer(threading.Thread):

    def run(self):
    global gMoney
    global gTimes
    while True:
    money = random.randint(100,1000)
    gCondition.acquire()
    if gTimes > 10:
    gCondition.release()
    break
    gMoney += money

    print('%s生产了%d元钱,剩余%d元钱'%(threading.current_thread(),money,gMoney))
    gTimes += 1
    gCondition.notify_all()

    gCondition.release()
    time.sleep(0.5)

    class Consumer(threading.Thread):
    def run(self):
    global gMoney
    while True:
    money = random.randint(100,1000)
    gCondition.acquire()
    while gMoney < money:
    if gTimes >=gTotalTimes:
    gCondition.release()
    return
    print('%s准备消费%d元钱,剩余%d元钱,余额不足!' %(threading.current_thread(),money,gMoney))

    gCondition.wait()
    gMoney -= money
    print('%s消费了%d元钱,剩余%d元钱' % (threading.current_thread(),money,gMoney),)
    gCondition.release()
    time.sleep(0.5)

    def main():
    for x in range(3):
    t = Consumer(name='消费者线程%d'%x)
    t.start()

    for x in range(5):
    t = Producer(name='生产者线程%d'%x)
    t.start()


    if __name__ == '__main__':
    main()

    Condition版的生戸者与消費者模式:
    tock版本的生戸者与淆酉者襖式可以正常的遥行。但是存在一一个不足,在消穂者中,怠是通せwtle true 死循粁井且上輌的方式去刔断軼不躬·上靤崖一个很耗薺CPU斉源的行カ.因此泣狆方式不是最好的.迂有一狆更好的方式便是使
    用threoing.cendition 来女親· threaing.Conditton 可以在没有数据的吋候阯于阻墓等待状志。一旦有含遁的數握了,逐可以使用notity相美的鑼戯来通丸其他処于等恃侍状志的も程。迄拝孰可い不用飮一些无用的上鈍和解御的操作。可以摧高程序的性能。首先対tmrecing.condition相美的注動霰个か紹,tnresding.coneito 霙儀threding.cock ,可以在修改全局數掘的吋候迸行、上蜻,也可以在慘改亢柴后迸行解情。以下将一-些常用的匠針徹个筒単的介紹:1 acqutre s上饋。2 release t解鎖。
    a. wait持当荊扶程妣于等待状杰, 并且会釋旅餉。可ソ樓其他扶程使用notify和notify_oll 伺徴喚酲·被嚀醒后会紲燒等待上領,上輌后継與拉行下薗的代烏。
    4 notify :知某↑正在等待的扶橿.默以是篳I↑等待的桟程。
    s notify_o t通知所有正在等待的註程· netify 和notify_o1l 不会釋欣飮。并且需愛在retiease之前墹用·Condition嶺的生戸看与消轡者模式代咼加下:

  • 相关阅读:
    Oracle常用系统查询SQL
    easyui中使用的遮罩层
    EasyUI相同的Tab只打开一个(即EasyUI方法的调用方法)
    jQueryEasyUI创建菜单主页
    linux 的环境变量的配置文件
    angular reactive form
    svn代码回滚
    golang restful api
    golang embedded structs
    Angular Multiple HTTP Requests with RxJS
  • 原文地址:https://www.cnblogs.com/cyz123/p/10639634.html
Copyright © 2020-2023  润新知