摘要:生產(chǎn)生成數(shù)據(jù),通知消費(fèi)者現(xiàn)在條數(shù)生產(chǎn)者判斷現(xiàn)在含有的數(shù)據(jù)大于不需要再生產(chǎn)消費(fèi)者無法消費(fèi)到數(shù)據(jù),處于等待狀態(tài)消費(fèi)數(shù)據(jù)
# -*- 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: # 生產(chǎn) queue.extend([i for i in range(10)]) print("生成數(shù)據(jù),通知消費(fèi)者 現(xiàn)在條數(shù):", len(queue)) condition.notify() condition.wait() else: print("生產(chǎn)者判斷現(xiàn)在含有的數(shù)據(jù): 大于0 不需要再生產(chǎn)", len(queue)) condition.notify() condition.release() time.sleep(1) def consumer(): global queue while True: condition.acquire() if len(queue) <= 0: print("消費(fèi)者無法消費(fèi)到數(shù)據(jù),處于等待狀態(tài)") condition.wait() else: print("消費(fèi)數(shù)據(jù):", queue.pop(0)) time.sleep(1) condition.notify() condition.release() p = Thread(target=producer) c = Thread(target=consumer) p.start() c.start()
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/40657.html
摘要:提供了多線程升級(jí)方案將同步替換成了顯示的操作。線程間通信接口可以替代傳統(tǒng)的線程間通信,用替換,用替換,用替換。商品執(zhí)行上述代碼,觀察結(jié)果可以看到,多個(gè)線程同時(shí)生產(chǎn)消費(fèi),由于指定喚醒互異線程,因此并不會(huì)引起錯(cuò)誤。 JDK 1.5提供了多線程升級(jí)方案將同步synchronized替換成了顯示的Lock操作。可以實(shí)現(xiàn)喚醒、凍結(jié)指定的線程。 Lock接口Lock 實(shí)現(xiàn)提供了比使用 synchr...
摘要:最后一直調(diào)用函數(shù)判斷節(jié)點(diǎn)是否被轉(zhuǎn)移到隊(duì)列上,也就是中等待獲取鎖的隊(duì)列。這樣的話,函數(shù)中調(diào)用函數(shù)就會(huì)返回,導(dǎo)致函數(shù)進(jìn)入最后一步重新獲取鎖的狀態(tài)。函數(shù)其實(shí)就做了一件事情,就是不斷嘗試調(diào)用函數(shù),將隊(duì)首的一個(gè)節(jié)點(diǎn)轉(zhuǎn)移到隊(duì)列中,直到轉(zhuǎn)移成功。 ?我在前段時(shí)間寫了一篇關(guān)于AQS源碼解析的文章AbstractQueuedSynchronizer超詳細(xì)原理解析,在文章里邊我說JUC包中的大部分多線程相...
摘要:總結(jié)在一開是的例子中,假設(shè)有兩個(gè)線程,分別代表生產(chǎn)者和消費(fèi)者線程,生產(chǎn)消費(fèi)元素的隊(duì)列容量為。 什么是Condition Condition必須要和獨(dú)占鎖一起使用,獨(dú)占鎖代替了原來的synchronized,Condition代替了原來的Object中的監(jiān)視器方法(wait, notify and notifyAll);一個(gè)Lock可以對(duì)應(yīng)多個(gè)Condition,這樣線程之間可以按照條件...
摘要:總結(jié)在一開是的例子中,假設(shè)有兩個(gè)線程,分別代表生產(chǎn)者和消費(fèi)者線程,生產(chǎn)消費(fèi)元素的隊(duì)列容量為。 什么是Condition Condition必須要和獨(dú)占鎖一起使用,獨(dú)占鎖代替了原來的synchronized,Condition代替了原來的Object中的監(jiān)視器方法(wait, notify and notifyAll);一個(gè)Lock可以對(duì)應(yīng)多個(gè)Condition,這樣線程之間可以按照條件...
摘要:在上一篇文章從到實(shí)現(xiàn)自己的阻塞隊(duì)列上中,我們已經(jīng)實(shí)現(xiàn)了一個(gè)可以使用的阻塞隊(duì)列版本。插入鎖隊(duì)列未滿的條件變量彈出鎖隊(duì)列非空的條件變量最后我們要對(duì)和方法中的調(diào)用做出一些調(diào)整。 在上一篇文章《從0到1實(shí)現(xiàn)自己的阻塞隊(duì)列(上)》中,我們已經(jīng)實(shí)現(xiàn)了一個(gè)可以使用的阻塞隊(duì)列版本。在這篇文章中,我們可以繼續(xù)我們的冒險(xiǎn)之旅,將我們的阻塞隊(duì)列提升到接近JDK版本的水平上。 更進(jìn)一步優(yōu)化效率 我們一直使用的...
閱讀 993·2021-11-15 18:06
閱讀 2362·2021-10-08 10:04
閱讀 2647·2019-08-28 18:03
閱讀 892·2019-08-26 13:42
閱讀 1913·2019-08-26 11:31
閱讀 2417·2019-08-23 17:13
閱讀 917·2019-08-23 16:45
閱讀 2050·2019-08-23 14:11