python淺談一下線程間通信之隊列
為什么需要線程間通信
一個人的力量是有限的,但是團(tuán)隊合作可以發(fā)揮更大的作用。而團(tuán)隊協(xié)作需要交流和通信來有效的分配任務(wù)和協(xié)調(diào)工作,來保證保時保量的完成工作。
為什么線程間需要通信呢?這就好比一個團(tuán)隊需要完成一個工作,但是這個工作周期性比較長,復(fù)雜度也比較高,此時就需要團(tuán)隊協(xié)作了,領(lǐng)導(dǎo)就把工作分為了n
份,a
、b
、c
員工每次領(lǐng)取1份工作,做完了再向老板同步,并且領(lǐng)取新的工作,這樣的話,工作很快就做完了嘛。
將線程代入上面的例子,在某些任務(wù)中,可能需要多個線程來完成同樣的任務(wù),所以線程間通信是為了線程之間的協(xié)作和同步,更快的完成任務(wù)。
線程間通信方式有哪些
在python
多線程編程中,線程間通信方法主要有以下幾種:
- 共享變量
這是最常用,也是用的最多的方式,這個很好理解,在同一進(jìn)程中,多個線程有一部分內(nèi)存是共用進(jìn)程的,所以多個線程可以使用“共享變量”的方式共享同一份數(shù)據(jù),通過對該變量的讀寫操作來實(shí)現(xiàn)線程間通信。
- 隊列
在python
中,為我們提供了隊列的標(biāo)準(zhǔn)庫Queue
,它是標(biāo)準(zhǔn)庫中的一個安全隊列的實(shí)現(xiàn)。作用是可以在多個線程間共享數(shù)據(jù),主要用法為通過get
方法將數(shù)據(jù)放入隊列,get
方法將數(shù)據(jù)從隊列中取出來,
- 管道
python
管道是通過multiprocessing
庫中的Pipe
實(shí)現(xiàn)的,可以在2個線程之間任意傳遞數(shù)據(jù),而且是雙向通信的,主要用法為通過send
方法發(fā)送數(shù)據(jù),通過recv
方法接收數(shù)據(jù)。
除此之外,還有其他方法,例如 借助第三方工具,比如redis
等。
線程間通信案例之隊列
共享變量,我們之前就已經(jīng)用過了,比如上一節(jié),我們自己實(shí)現(xiàn)了python
的讀寫鎖,就用到了共享變量的方式。這里就不再過多闡述了。這里將介紹一下管道的案例:
隊列多用于生產(chǎn)者消費(fèi)者,在python
中,是使用queue
模塊下的Queue
方法,創(chuàng)建一個新的隊列語句為:
queues = queue.Queue()
其中,Queue
可以傳入一個maxsize
,它將作為隊列的最大值,默認(rèn)的話,是無限制。
想要往隊列中寫入數(shù)據(jù)的話,使用put
方法即可,例如,向隊列寫入字符串"123",我們僅需要調(diào)用put
方法即可,例如:
queues.put("123")
而想要從隊列中獲取數(shù)據(jù)的話,需要使用get
方法,例如:
data = queues.get() print(data)
除此之外,還有隊列其他常用的方法,如: qsize()
會返回隊列中元素的數(shù)量,empty()
會判斷隊列是否為空,full()
會判斷隊列是否已經(jīng)滿了。
這里舉一個文件分發(fā)下載的例子,我們需要定義一個生產(chǎn)者,用于發(fā)布任務(wù),定義多個消費(fèi)者,用于執(zhí)行任務(wù),代碼如下:
在上述代碼中,我們定義了生產(chǎn)者和消費(fèi)者2個類,其初始方法__init__
會傳入隊列信息,生產(chǎn)者有定義了2個方法,一個是put
,是將元素放入隊列中,還有一個是qsize
,是返回當(dāng)前隊列的個數(shù)。而消費(fèi)者只定義了一個方法get
,上面寫了一個死循環(huán),向隊列獲取數(shù)據(jù),每獲取到一個數(shù)據(jù),休息15秒。
在主函數(shù)中,我們定義了一個公共的隊列queues
,而后定義了生產(chǎn)者p
和消費(fèi)者q
,二者都傳入了同一個隊列queues
。最后我們寫了3個線程,用于執(zhí)行消費(fèi)者q
的get
方法。 和 調(diào)用一個生產(chǎn)者方法put
。
執(zhí)行結(jié)果為:
上述結(jié)果展現(xiàn)的是,生產(chǎn)者生成數(shù)據(jù),而消費(fèi)者接收。file_0
到file_9
都只被消費(fèi)了一次,可見隊列是自己保證了線程競爭問題的。
總結(jié)
本篇文章介紹了為什么需要線程間通信,以及通信方式有哪些,最后每種通信方式都舉了一個例子,總的來說,最常用的還是共享變量的方式來進(jìn)行線程間通信,但是此方法需要自己來保證線程競爭問題,除此之外,還有隊列和管道,此二者不用擔(dān)心線程競爭,但是前則更適用于生產(chǎn)者-消費(fèi)者模型,后者更適用于兩線程間相互通信。
到此這篇關(guān)于python淺談一下線程間通信之隊列的文章就介紹到這了,更多相關(guān)python通信隊列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3的高階函數(shù)map,reduce,filter的示例詳解
這篇文章主要介紹了Python3的高階函數(shù)map,reduce,filter的示例代碼,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07python使用aiohttp通過設(shè)置代理爬取基金數(shù)據(jù)簡單示例
這篇文章主要為大家介紹了python使用aiohttp通過設(shè)置代理爬取基金數(shù)據(jù)簡單示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06caffe binaryproto 與 npy相互轉(zhuǎn)換的實(shí)例講解
今天小編就為大家分享一篇caffe binaryproto 與 npy相互轉(zhuǎn)換的實(shí)例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07python獲取異常信息exc_info和print_exc的使用
python通過sys.exc_info獲取異常信息,通過traceback.print_exc打印堆棧信息,包括錯誤類型和錯誤位置等信息,本文就來介紹一下具體用法,感興趣的可以了解一下2023-12-12Windows平臺Python編程必會模塊之pywin32介紹
在Windows平臺上,從原來使用C/C++編寫原生EXE程序,到使用Python編寫一些常用腳本程序,成熟的模塊的使用使得編程效率大大提高了2019-10-10