摘要:上一篇文章線(xiàn)程專(zhuān)題事件下一篇文章線(xiàn)程專(zhuān)題使用鎖的注意事項(xiàng)條件變量時(shí)構(gòu)建在另一個(gè)鎖上的同步原語(yǔ),當(dāng)需要線(xiàn)程關(guān)注特定的狀態(tài)變化或事件發(fā)生時(shí)將使用這個(gè)鎖。
上一篇文章:Python線(xiàn)程專(zhuān)題6:事件
下一篇文章:Python線(xiàn)程專(zhuān)題8:使用鎖的注意事項(xiàng)
條件變量時(shí)構(gòu)建在另一個(gè)鎖上的同步原語(yǔ),當(dāng)需要線(xiàn)程關(guān)注特定的狀態(tài)變化或事件發(fā)生時(shí)將使用這個(gè)鎖。典型的用法是生產(chǎn)者與消費(fèi)者問(wèn)題,其中一個(gè)線(xiàn)程生產(chǎn)的數(shù)據(jù)提供給另外一個(gè)線(xiàn)程使用。
語(yǔ)法:c=Condition(lock) 穿件新的條件變量。lock時(shí)可選的Lock或RLock的實(shí)例。如果未提供lock參數(shù),就會(huì)創(chuàng)建新的RLock實(shí)例供條件變量使用。常用方法:
c.acquire(*args):獲取底層鎖。此方法將調(diào)用底層鎖上對(duì)應(yīng)的acquire(*args)方法。 c.release():釋放底層鎖。此方法將調(diào)用底層鎖上對(duì)應(yīng)的release()方法 c.wait(timeout):等待直到獲取通知或出現(xiàn)超時(shí)為止。此方法在調(diào)用線(xiàn)程已經(jīng)獲取鎖之后調(diào)用。 調(diào)用時(shí),將釋放底層鎖,而且線(xiàn)程將進(jìn)入睡眠狀態(tài),直到另一個(gè)線(xiàn)程在條件變量上執(zhí)行notify()或notify_all()方法將其喚醒為止。 在線(xiàn)程被喚醒后,線(xiàn)程講重新獲取鎖,方法也會(huì)返回。timeout是浮點(diǎn)數(shù),單位為秒。 如果超時(shí),線(xiàn)程將被喚醒,重新獲取鎖,而控制將被返回。 c.notify(n):?jiǎn)拘岩粋€(gè)或多個(gè)等待此條件變量的線(xiàn)程。此方法只會(huì)在調(diào)用線(xiàn)程已經(jīng)獲取鎖之后調(diào)用, 而且如果沒(méi)有正在等待的線(xiàn)程,它就什么也不做。 n指定要喚醒的線(xiàn)程數(shù)量,默認(rèn)為1.被喚醒的線(xiàn)程在它們重新獲取鎖之前不會(huì)從wait()調(diào)用返回。 c.notify_all():?jiǎn)拘阉械却藯l件的線(xiàn)程。實(shí)例模版:使用條件變量
#條件變量實(shí)例 from threading import Condition c=Condition() def producer(): while True: c.acquire() #生產(chǎn)東西 ... c.notify() c.release() def consumer(): while True: c.acquire() while 沒(méi)有可用的東西: c.wait()#等待出現(xiàn) c.release() #使用生產(chǎn)的東西 ...
注意:如果存在多個(gè)線(xiàn)程等待同一個(gè)條件,notify()操作會(huì)喚醒他們中的一個(gè)或多個(gè)(這種行為取決于底層的操作系統(tǒng))。因此,始終有這樣的可能:某個(gè)線(xiàn)程被喚醒后,缺發(fā)現(xiàn)它等待的條件不存在了,這解釋了為什么在consumer函數(shù)中使用while循環(huán),如果線(xiàn)程醒來(lái),但是生成的項(xiàng)已經(jīng)消失,它就會(huì)回去等待下一個(gè)信號(hào)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/42418.html
摘要:上一篇文章進(jìn)程專(zhuān)題完結(jié)篇多進(jìn)程處理的一般建議下一篇文章線(xiàn)程專(zhuān)題多線(xiàn)程使用的必要性進(jìn)程線(xiàn)程進(jìn)程能夠完成多任務(wù),比如在一個(gè)電腦上可以運(yùn)行多個(gè)軟件。由于占用資源少,也使得多線(xiàn)程程序并發(fā)比較高。 上一篇文章:Python進(jìn)程專(zhuān)題完結(jié)篇:多進(jìn)程處理的一般建議下一篇文章:Python線(xiàn)程專(zhuān)題1:多線(xiàn)程使用的必要性 進(jìn)程VS線(xiàn)程 進(jìn)程:能夠完成多任務(wù),比如在一個(gè)電腦上可以運(yùn)行多個(gè)軟件。線(xiàn)程:也能夠...
摘要:上一篇文章線(xiàn)程專(zhuān)題信號(hào)量與有邊界的信號(hào)量下一篇文章線(xiàn)程專(zhuān)題條件變量事件用于在線(xiàn)程之間通信。一個(gè)線(xiàn)程發(fā)送事件信號(hào),一個(gè)或多個(gè)其他線(xiàn)程等待它。阻塞直到內(nèi)部標(biāo)志為。最壞的情況是,由于事件信號(hào)丟失,整個(gè)程序?qū)?huì)掛起。 上一篇文章:Python線(xiàn)程專(zhuān)題5:信號(hào)量與有邊界的信號(hào)量下一篇文章:Python線(xiàn)程專(zhuān)題7:條件變量事件用于在線(xiàn)程之間通信。一個(gè)線(xiàn)程發(fā)送【事件】信號(hào),一個(gè)或多個(gè)其他線(xiàn)程等待它。...
摘要:上一篇文章線(xiàn)程專(zhuān)題條件變量下一篇文章線(xiàn)程專(zhuān)題線(xiàn)程終止與掛起使用諸如之類(lèi)的鎖原語(yǔ)時(shí),必須多加小心,鎖的錯(cuò)誤使用很容易導(dǎo)致死鎖或相互競(jìng)爭(zhēng)。依賴(lài)鎖的代碼應(yīng)該保證當(dāng)出現(xiàn)異常時(shí)可以正常的釋放鎖。 上一篇文章:Python線(xiàn)程專(zhuān)題7:條件變量下一篇文章:Python線(xiàn)程專(zhuān)題9:線(xiàn)程終止與掛起 使用諸如Lock、RLock、Semphore之類(lèi)的鎖原語(yǔ)時(shí),必須多加小心,鎖的錯(cuò)誤使用很容易導(dǎo)致死鎖或...
摘要:可以使用標(biāo)準(zhǔn)的索引切片迭代操作訪(fǎng)問(wèn)它,其中每項(xiàng)操作均鎖進(jìn)程同步,對(duì)于字節(jié)字符串,還具有屬性,可以把整個(gè)數(shù)組當(dāng)做一個(gè)字符串進(jìn)行訪(fǎng)問(wèn)。當(dāng)所編寫(xiě)的程序必須一次性操作大量的數(shù)組項(xiàng)時(shí),如果同時(shí)使用這種數(shù)據(jù)類(lèi)型和用于同步的單獨(dú)大的鎖,性能將極大提升。 上一篇文章:Python進(jìn)程專(zhuān)題5:進(jìn)程間通信下一篇文章:Python進(jìn)程專(zhuān)題7:托管對(duì)象 我們現(xiàn)在知道,進(jìn)程之間彼此是孤立的,唯一通信的方式是隊(duì)...
摘要:上一篇文章線(xiàn)程專(zhuān)題多線(xiàn)程使用的必要性下一篇文章線(xiàn)程專(zhuān)題對(duì)象在一個(gè)進(jìn)程內(nèi)的所有線(xiàn)程共享全局變量。但多線(xiàn)程對(duì)全局變量的更改會(huì)導(dǎo)致變量值得混亂。 上一篇文章: Python線(xiàn)程專(zhuān)題1:多線(xiàn)程使用的必要性下一篇文章:Python線(xiàn)程專(zhuān)題3:thread對(duì)象 在一個(gè)進(jìn)程內(nèi)的所有線(xiàn)程共享全局變量。但多線(xiàn)程對(duì)全局變量的更改會(huì)導(dǎo)致變量值得混亂。 實(shí)例:驗(yàn)證同一個(gè)進(jìn)程內(nèi)所有線(xiàn)程共享全局變量 代碼: #...
閱讀 2736·2021-11-24 09:39
閱讀 1741·2021-11-24 09:38
閱讀 686·2021-11-22 14:44
閱讀 1967·2021-11-18 10:02
閱讀 2861·2021-11-18 10:02
閱讀 1222·2021-10-14 09:43
閱讀 4419·2021-09-29 09:35
閱讀 621·2021-07-30 15:30