python 線程超時設置_python 條件變量Condition(36)

文章首發微信公眾號,微信搜索:猿說python

對于線程與線程之間的交互我們在前面的文章已經介紹了 python 互斥鎖Lock / python事件Event , 今天繼續介紹一種線程交互方式 – 線程條件變量Condition.

v2-6433c48aa4434a8c67ba914696eed481_b.jpg

一.線程條件變量Condition相關函數介紹

acquire() — 線程鎖,注意線程條件變量Condition中的所有相關函數使用必須在acquire() /release() 內部操作;

release() — 釋放鎖,注意線程條件變量Condition中的所有相關函數使用必須在acquire() /release() 內部操作;

wait(timeout) — 線程掛起(阻塞狀態),直到收到一個notify通知或者超時才會被喚醒繼續運行(超時參數默認不設置,可選填,類型是浮點數,單位是秒)。wait()必須在已獲得Lock前提下才能調用,否則會觸發RuntimeError;

notify(n=1) — 通知其他線程,那些掛起的線程接到這個通知之后會開始運行,缺省參數,默認是通知一個正等待通知的線程,最多則喚醒n個等待的線程。notify()必須在已獲得Lock前提下才能調用,否則會觸發RuntimeError,notify()不會主動釋放Lock;

notifyAll() — 如果wait狀態線程比較多,notifyAll的作用就是通知所有線程;

v2-9f7eae5408bfcdfdde997c78d17774e4_b.jpg

二.線程條件變量Condition原理

在前面的文章已經介紹過互斥鎖,主要作用是并行訪問共享資源時,保護共享資源,防止出現臟數據。python 條件變量Condition也需要關聯互斥鎖,同時Condition自身提供了wait/notify/notifyAll方法,用于阻塞/通知其他并行線程,可以訪問共享資源了。可以這么理解,Condition提供了一種多線程通信機制,假如線程1需要數據,那么線程1就阻塞等待,這時線程2就去制造數據,線程2制造好數據后,通知線程1可以去取數據了,然后線程1去獲取數據。

v2-ae5bbf94118ba6e2b3b6d26691c49d23_b.jpg

三.線程條件變量Condition使用

案例一:成語接龍

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:何以解憂
@Blog(個人博客地址): shuopython.com
@WeChat Official Account(微信公眾號):猿說python
@Github:www.github.com@File:python_.py
@Time:2019/10/21 21:25@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!
"""# 導入線程模塊
import threading# 創建條件變量condition
con = threading.Condition()def thread_one(name):# 條件變量condition 線程上鎖con.acquire()print("{}:成語接龍準備好了嗎".format(name))# 喚醒正在等待(wait)的線程con.notify()# 等待對方回應消息,使用wait阻塞線程,等待對方通過notify喚醒本線程con.wait()print("{}:一干二凈".format(name))# 喚醒對方con.notify()# 等待消息答應con.wait()print("{}:一天就知道看抖音美女,給你來個簡單點的,來了:毛手毛腳".format(name))# 喚醒對方con.notify()# 等待消息答應con.wait()print("{}:喲喲喲,不錯不錯!".format(name))# 喚醒對方con.notify()# 條件變量condition 線程釋放鎖con.release()def thread_two(name):# 條件變量condition 線程上鎖con.acquire()# wait阻塞狀態,等待其他線程通過notify喚醒本線程con.wait()print("{}:準備好了~開始吧!".format(name))# 喚醒對方con.notify()# 等待消息答應con.wait()print("{}:凈你妹啊,沒法接...來個簡單點的...".format(name))# 喚醒對方con.notify()# 等待消息答應con.wait()print("{}:嘿,這個我知道:腳踏實地".format(name))# 喚醒對方con.notify()con.release()if __name__ == "__main__":# 創建并初始化線程t1 = threading.Thread(target=thread_one,args=("A"))t2 = threading.Thread(target=thread_two,args=("B"))# 啟動線程 -- 注意線程啟動順序,啟動順序很重要t2.start()t1.start()# 阻塞主線程,等待子線程結束t1.join()t2.join()print("程序結束!")

輸出結果:

A:成語接龍準備好了嗎
B:準備好了~開始吧!
A:一干二凈
B:凈你妹啊,沒法接...來個簡單點的...
A:一天就知道看抖音美女,給你來個簡單點的,來了:毛手毛腳
B:嘿,這個我知道:腳踏實地
A:喲喲喲,不錯不錯!
程序結束!

v2-a43bd4d06d5e52fe254a5240f3cdfba1_b.jpg

案例二:生產者與消費者模式,以吃火鍋為例:一盤老肉片有10塊肉,吃完了又重新往鍋里加….

生產者:往鍋里加老肉片,每次加一盤(10塊);

消費者:吃煮熟的肉片,沒吃一片,肉片數量減一,吃完為止;

# 導入線程模塊
import threading
import time# 創建條件變量condition
con = threading.Condition()
meat_num = 0def thread_consumers():# 條件變量condition 線程上鎖con.acquire()# 全局變量聲明關鍵字 globalglobal meat_nummeat_num = 0# 等待肉片下鍋煮熟con.wait()while True:print("我來一塊肉片...")meat_num -= 1print("剩余肉片數量:%d"%meat_num)time.sleep(0.5)if meat_num == 0:# 肉片吃光了,通知老板添加肉片print("老板,再來一份老肉片...")con.notify()# 肉片吃光了,等待肉片con.wait()# 條件變量condition 線程釋放鎖con.release()def thread_producer():# 條件變量condition 線程上鎖con.acquire()# 全局變量聲明關鍵字 globalglobal meat_num# 肉片熟了,可以開始吃了meat_num = 10print("肉片熟了,可以開始吃了...")con.notify()while True:# 阻塞函數,等待肉片吃完的通知con.wait()meat_num = 10# 添加肉片完成,可以繼續開吃print("添加肉片成功!當前肉片數量:%d"%meat_num)time.sleep(1)con.notify()con.release()if __name__ == "__main__":# 創建并初始化線程t1 = threading.Thread(target=thread_producer)t2 = threading.Thread(target=thread_consumers)# 啟動線程 -- 注意線程啟動順序,啟動順序很重要t2.start()t1.start()# 阻塞主線程,等待子線程結束t1.join()t2.join()print("程序結束!")

輸出結果:

肉片熟了,可以開始吃了...
我來一塊肉片...
剩余肉片數量:9
我來一塊肉片...
剩余肉片數量:8
我來一塊肉片...
剩余肉片數量:7
我來一塊肉片...
剩余肉片數量:6
我來一塊肉片...
剩余肉片數量:5
我來一塊肉片...
剩余肉片數量:4
我來一塊肉片...
剩余肉片數量:3
我來一塊肉片...
剩余肉片數量:2
我來一塊肉片...
剩余肉片數量:1
我來一塊肉片...
剩余肉片數量:0
老板,再來一份老肉片...
添加肉片成功!當前肉片數量:10
我來一塊肉片...
剩余肉片數量:9
我來一塊肉片...
剩余肉片數量:8
我來一塊肉片...
剩余肉片數量:7
.............

注意:

1.全局變量要聲明關鍵字 global

2.注意線程的啟動順序,這個很重要;

四.重點總結

注意線程互斥鎖Lock/線程事件Event/線程條件變量Condition三者的區別,場景不同,使用方式也不同,前兩者一般可以作為簡單的線程交互,線程條件變量Condition可以用于比較復雜的線程交互!

猜你喜歡:

1.python線程創建和參數傳遞

2.python線程互斥鎖Lock

3.python線程事件Event

4.python return邏輯判斷表達式

轉載請注明:猿說Python ? python條件變量Condition

想了解更多python內容請直接搜索微信公眾號:猿說python

Python教程 - 猿說Python?www.shuopython.com
v2-94ebac7f53f66e16a00e0604e0f4e3ce_180x120.jpg

本人也還在學習python中,博客會持續更新ing,有興趣的小伙伴關注走一波,推薦瀏覽個人博客網站:猿說python,文章采用樹狀分類,結構目錄清晰一點,文章內容有問題的話歡迎給出建議或者直接留言.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258926.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258926.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258926.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MsWord 操作總結

轉自(http://www.cnblogs.com/eye-like/p/4121219.html) Msdn上的word操作api(不過只有英文版,英文差的先閃過) Word2007的API:http://msdn.microsoft.com/en-us/library/bb257531(voffice.12).aspxWord201…

fwrite,fread and fprintf,fscanf的一些使用體會

這周一直在完成一個任務,就是將訓練出的多個model寫成一個model。其中我們使用了c語言的讀寫方法,搞了一星期, 挖了很多坑,最終都鏟平了。下面列舉出若干有用的知識。 1.fwrite,fread VS fprintf,fscanf的區別 fwrite,fread 讀寫…

《第一桶金怎么賺——淘寶開店創業致富一冊通》一一1.4 淘寶開店創業的流程...

本節書摘來自異步社區出版社《第一桶金怎么賺——淘寶開店創業致富一冊通》一書中的第1章,第1.4節,作者:葛存山,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 1.4 淘寶開店創業的流程 第一桶金怎么賺——淘寶開店創業致…

檢測虛擬機代碼總匯(更新中)

檢測虛擬機代碼 1 004092D0 /. 55 push ebp2 004092D1 |. 8BEC mov ebp,esp3 004092D3 |. 51 push ecx4 004092D4 |. 53 push ebx5 004092D5 |. 68 1D934000 push 0040931D 6 004092DA |. 64:FF35…

兩數之和 python_同一屏幕播放兩個視頻 視頻左右兩個畫面或視頻上下兩個畫面如何制作...

咱們在網上經常可以看到一些視頻畫面是可以在同一屏幕播放兩個視頻,有的是視頻左右兩個畫面或視頻上下兩個畫面這些是如何制作的呢,其實熟悉視頻編輯軟件的網友應該會比較了解這些操作,好嘞,來,現在就讓小編來演示一下…

dlib人臉特征點對齊

前面我們介紹了使用dlib進行人臉檢測&#xff0c;下面我們給出如何使用dlib進行人臉特征點檢測。我們直接貼出代碼。我們的代碼包括如下幾部分功能&#xff1a; 檢測單張圖片檢測一個視頻檢測一個camera 先給出代碼&#xff1a; #include <dlib/image_processing/frontal_…

IOS開發基礎知識--碎片13

1:運行程序報the file couldnt be opened because you dont have permission to view it 解決辦法&#xff1a;項目—>targets->build settings->build options->changed the value of the "Compiler for C/C/Objective-C" to Default Compiler. 2:百度…

《LoadRunner 12七天速成寶典》—第2章2.6節第二個性能測試案例

本節書摘來自異步社區《LoadRunner 12七天速成寶典》一書中的第2章&#xff0c;第2.6節第二個性能測試案例&#xff0c;作者陳霽&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.6 第二個性能測試案例云云&#xff1a;烤魚吃得很爽。 戀戀&#xff1a;就…

MongoDB_1

突然想去看下MongoDB的東西&#xff0c;于是有了這篇文章。其實很早以前就看過一些關于NoSql的文章&#xff0c;還記得當時里面有介紹MongoDB的&#xff0c;多瞅了2眼&#xff0c;并且在Window下安裝了MongoDB的驅動&#xff0c;小玩了會。今天重新翻出來&#xff0c;沒成想在命…

牛頓法與擬牛頓法,SDM方法的一些注記

SDM方法 考慮一般額NLS問題&#xff1a; f(x)minx||h(x)?y||2這里x為優化參數&#xff0c;h為非線性函數&#xff0c;y是已知變量&#xff0c;如下是基于梯度的迭代公式&#xff1a; ΔxαAJTh(h(x)?y)這里α是步長&#xff0c;A是縮放因子&#xff0c;Jh是h在當前參數x下的…

pyqt5從子目錄加載qrc文件_實戰PyQt5: 045-添加資源文件

添加資源文件在使用PyQt進行圖形界面開發的時候不免要用到一些外部資源&#xff0c;比如圖片&#xff0c;qss配置文件等。在前面代碼中&#xff0c;遇到這類問題&#xff0c;我們使用絕對路徑的方式來解決&#xff0c;這種方式&#xff0c;本身有其不方便之處(比如&#xff0c;…

《 Python樹莓派編程》——2.7 總結

本節書摘來自華章出版社《Python樹莓派編程》一書中的第2章&#xff0c;第2.7節&#xff0c;作者&#xff1a;[美]沃爾弗拉姆多納特&#xff08;Wolfram Donat&#xff09;著 韓德強 等譯&#xff0c;更多章節內容可以訪問云棲社區“華章計算機”公眾號查看。 2.7 總結 本章簡…

ACM的輸入輸出總結

關于ACM的輸入輸出&#xff08;一&#xff09; 一般來說ACM的現場賽會規定輸入輸出 或者是文件輸入標準輸出 也可能是文件輸入文件輸出 如果沒有規定的話那么一般就是標準的輸入輸出了 那說一下輸入輸出的重定向 一般用下面兩種方法 c常用: #include <fstream.h>ifstream…

hdu 2064漢諾塔III 遞推

漢諾塔遞推題&#xff0c;比漢諾塔多了一個限制條件&#xff0c;盤子只允許在相鄰的柱子之間移動。 分析&#xff1a; 第1步:初始狀態&#xff1b; 第2步:把上面的n-1個盤移到第3號桿上&#xff1b; 第3步:把第n個盤從1移到2&#xff1b; 第4步:把前n-1個從3移到1&#xff0c;給…

西門子ddc_鐵門關西門子兩通電動閥VVF42.25-10C+SKD60西

鐵門關西門子兩通電動閥西SIEMENS/西門子電動溫控閥、控制箱、電動蝶閥、電動球閥、超聲波熱量表、超聲波流量計、電磁流量計閥體灰口鑄鐵 EN-GJL-2502.霍尼韋爾主營&#xff1a;樓宇資料系統、熱網自控系統、風機盤管電動兩通閥、空氣壓差開關、水流開關、電動執行器、風閥執行…

swap關于指針的使用

先看下面兩個例子&#xff1a; #include <iostream> // std::cout #include <utility> // std::swapint main() {int x 10, y 20; // x:10 y:20int* p1 &x;int* p2 &y;std::swap(*p1, *p2); // x:20 y:10 …

JS-鍵盤事件之方向鍵移動元素

注意三點&#xff1a; 1&#xff1a;事件名稱onkeydown。 2&#xff1a;事件加給document&#xff0c;而非window。 3&#xff1a; 把元素的top&#xff0c;left值分別用offsetTop&#xff0c;offsetLeft來設定。 <!DOCTYPE html> <html><head><meta char…

Swift學習字符串、數組、字典

一.字符串的使用 let wiseWords "\"I am a handsome\"-boy" var emptyString "" if emptyString.isEmpty{ println("這是一個空值") }簡單說明&#xff1a;isEmpty方法是用來判斷字符串是否為空值的&#xff0c;之后會執行if語句中的…

python對excel操作簡書_Python讀寫Excel表格,就是這么簡單粗暴又好用

最近在做一些數據處理和計算的工作&#xff0c;因為數據是以.CSV格式保存的&#xff0c;因此剛開始直接用Excel來處理。 但是做著做著發現重復的勞動&#xff0c;其實并沒有多大的意義&#xff0c;于是就想著寫個小工具幫著處理。 以前正好在一本書上看到過&#xff0c;使用Pyt…

九度 1470 調整方陣

題目描述&#xff1a; 輸入一個N&#xff08;N<10&#xff09;階方陣&#xff0c;按照如下方式調整方陣&#xff1a;1.將第一列中最大數所在的行與第一行對調。2.將第二列中從第二行到第N行最大數所在的行與第二行對調。依此類推...N-1.將第N-1列中從第N-1行到第N行最大數所…