【爬蟲】Condition版的生產者和消費者模式

Condition版的生產者和消費者模式
  threading.Condition 在沒有數據的時候處於阻塞狀態,有數據能夠使用notify的函數通知等等待狀態的線程運做
  threading.Condition 其實是繼承threading.Lock

  acquire:上鎖。
  release:解鎖。
  wait:將當前線程處於等待狀態,而且會釋放鎖。能夠被其餘線程使用notify和notify_all函數喚醒。被喚醒後會繼續等待上鎖,上鎖後繼續執行下面的代碼。
  notify:通知某個正在等待的線程,默認是第1個等待的線程。
  notify_all:通知全部正在等待的線程。notify和notify_all不會釋放鎖。而且須要在release以前調用

  gLoad = threading.Condition()dom

 

'''
Condition版的生產者和消費者模式
'''

import threading
import random
import time

gMoney = 1000       # 原始金額
gLoad = threading.Condition()
gTime = 0           # 生產次數

class Producer(threading.Thread):
    def run(self):
        global gMoney
        global gTime
        while True:
            gLoad.acquire()
            if gTime < 10:
                gTime += 1
                money = random.randint(50,500)
                gMoney += money
                print("生產線程%s生成了%d元,剩餘%d元"%(threading.current_thread(),money,gMoney))

            else:
                gLoad.release()
                break
            gLoad.notify_all()      # 通知全部阻塞的線程,在釋放鎖以前
            gLoad.release()
            time.sleep(2)



class Consumer(threading.Thread):
    def run(self):
        global gMoney
        global gTime
        while True:
            gLoad.acquire()
            money = random.randint(100,1000)
            while money > gMoney:
                if gTime == 10:
                    gLoad.release()
                    return
                print("消費線程%s準備消費了%d元,剩餘%d元,不足" % (threading.current_thread(), money, gMoney))
                gLoad.wait()        # 使進程在阻塞狀態,同時釋放鎖
            gMoney -= money
            print("消費線程%s消費了%d元,剩餘%d元" % (threading.current_thread(), money, gMoney))
            gLoad.release()
            time.sleep(2)


def main():
    for x in range(3):
        t = Consumer(name="消費者線程%s"%x)
        t.start()

    for x in range(5):
        t = Producer(name="生產者線程%s"%x)
        t.start()




if __name__ == '__main__':
    main()
相關文章
相關標籤/搜索