欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python淺談一下線程間通信之隊(duì)列

 更新時(shí)間:2023年04月24日 11:04:11   作者:真的不能告訴你我的名字  
本篇文章介紹了為什么需要線程間通信,以及通信方式有哪些,最后每種通信方式都舉了一個(gè)例子,最常用的還是共享變量的方式來(lái)進(jìn)行線程間通信。感興趣的朋友可以閱讀本文

為什么需要線程間通信

一個(gè)人的力量是有限的,但是團(tuán)隊(duì)合作可以發(fā)揮更大的作用。而團(tuán)隊(duì)協(xié)作需要交流和通信來(lái)有效的分配任務(wù)和協(xié)調(diào)工作,來(lái)保證保時(shí)保量的完成工作。

為什么線程間需要通信呢?這就好比一個(gè)團(tuán)隊(duì)需要完成一個(gè)工作,但是這個(gè)工作周期性比較長(zhǎng),復(fù)雜度也比較高,此時(shí)就需要團(tuán)隊(duì)協(xié)作了,領(lǐng)導(dǎo)就把工作分為了n份,ab、c員工每次領(lǐng)取1份工作,做完了再向老板同步,并且領(lǐng)取新的工作,這樣的話,工作很快就做完了嘛。

將線程代入上面的例子,在某些任務(wù)中,可能需要多個(gè)線程來(lái)完成同樣的任務(wù),所以線程間通信是為了線程之間的協(xié)作和同步,更快的完成任務(wù)。

線程間通信方式有哪些

python多線程編程中,線程間通信方法主要有以下幾種:

  • 共享變量

這是最常用,也是用的最多的方式,這個(gè)很好理解,在同一進(jìn)程中,多個(gè)線程有一部分內(nèi)存是共用進(jìn)程的,所以多個(gè)線程可以使用“共享變量”的方式共享同一份數(shù)據(jù),通過(guò)對(duì)該變量的讀寫(xiě)操作來(lái)實(shí)現(xiàn)線程間通信。

  • 隊(duì)列

python中,為我們提供了隊(duì)列的標(biāo)準(zhǔn)庫(kù)Queue,它是標(biāo)準(zhǔn)庫(kù)中的一個(gè)安全隊(duì)列的實(shí)現(xiàn)。作用是可以在多個(gè)線程間共享數(shù)據(jù),主要用法為通過(guò)get方法將數(shù)據(jù)放入隊(duì)列,get方法將數(shù)據(jù)從隊(duì)列中取出來(lái),

  • 管道

python管道是通過(guò)multiprocessing庫(kù)中的Pipe實(shí)現(xiàn)的,可以在2個(gè)線程之間任意傳遞數(shù)據(jù),而且是雙向通信的,主要用法為通過(guò)send方法發(fā)送數(shù)據(jù),通過(guò)recv方法接收數(shù)據(jù)。

除此之外,還有其他方法,例如 借助第三方工具,比如redis等。

線程間通信案例之隊(duì)列

共享變量,我們之前就已經(jīng)用過(guò)了,比如上一節(jié),我們自己實(shí)現(xiàn)了python的讀寫(xiě)鎖,就用到了共享變量的方式。這里就不再過(guò)多闡述了。這里將介紹一下管道的案例:

隊(duì)列多用于生產(chǎn)者消費(fèi)者,在python中,是使用queue模塊下的Queue方法,創(chuàng)建一個(gè)新的隊(duì)列語(yǔ)句為:

queues = queue.Queue()

其中,Queue可以傳入一個(gè)maxsize,它將作為隊(duì)列的最大值,默認(rèn)的話,是無(wú)限制。

想要往隊(duì)列中寫(xiě)入數(shù)據(jù)的話,使用put方法即可,例如,向隊(duì)列寫(xiě)入字符串"123",我們僅需要調(diào)用put方法即可,例如:

queues.put("123")

而想要從隊(duì)列中獲取數(shù)據(jù)的話,需要使用get方法,例如:

data = queues.get()
print(data)

除此之外,還有隊(duì)列其他常用的方法,如: qsize()會(huì)返回隊(duì)列中元素的數(shù)量,empty()會(huì)判斷隊(duì)列是否為空,full()會(huì)判斷隊(duì)列是否已經(jīng)滿了。

這里舉一個(gè)文件分發(fā)下載的例子,我們需要定義一個(gè)生產(chǎn)者,用于發(fā)布任務(wù),定義多個(gè)消費(fèi)者,用于執(zhí)行任務(wù),代碼如下:

在上述代碼中,我們定義了生產(chǎn)者和消費(fèi)者2個(gè)類,其初始方法__init__會(huì)傳入隊(duì)列信息,生產(chǎn)者有定義了2個(gè)方法,一個(gè)是put,是將元素放入隊(duì)列中,還有一個(gè)是qsize,是返回當(dāng)前隊(duì)列的個(gè)數(shù)。而消費(fèi)者只定義了一個(gè)方法get,上面寫(xiě)了一個(gè)死循環(huán),向隊(duì)列獲取數(shù)據(jù),每獲取到一個(gè)數(shù)據(jù),休息15秒。

在主函數(shù)中,我們定義了一個(gè)公共的隊(duì)列queues,而后定義了生產(chǎn)者p和消費(fèi)者q,二者都傳入了同一個(gè)隊(duì)列queues。最后我們寫(xiě)了3個(gè)線程,用于執(zhí)行消費(fèi)者qget方法。 和 調(diào)用一個(gè)生產(chǎn)者方法put。

執(zhí)行結(jié)果為:

上述結(jié)果展現(xiàn)的是,生產(chǎn)者生成數(shù)據(jù),而消費(fèi)者接收。file_0file_9都只被消費(fèi)了一次,可見(jiàn)隊(duì)列是自己保證了線程競(jìng)爭(zhēng)問(wèn)題的。

總結(jié)

本篇文章介紹了為什么需要線程間通信,以及通信方式有哪些,最后每種通信方式都舉了一個(gè)例子,總的來(lái)說(shuō),最常用的還是共享變量的方式來(lái)進(jìn)行線程間通信,但是此方法需要自己來(lái)保證線程競(jìng)爭(zhēng)問(wèn)題,除此之外,還有隊(duì)列和管道,此二者不用擔(dān)心線程競(jìng)爭(zhēng),但是前則更適用于生產(chǎn)者-消費(fèi)者模型,后者更適用于兩線程間相互通信。

到此這篇關(guān)于python淺談一下線程間通信之隊(duì)列的文章就介紹到這了,更多相關(guān)python通信隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python3的高階函數(shù)map,reduce,filter的示例詳解

    Python3的高階函數(shù)map,reduce,filter的示例詳解

    這篇文章主要介紹了Python3的高階函數(shù)map,reduce,filter的示例代碼,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • python使用aiohttp通過(guò)設(shè)置代理爬取基金數(shù)據(jù)簡(jiǎn)單示例

    python使用aiohttp通過(guò)設(shè)置代理爬取基金數(shù)據(jù)簡(jiǎn)單示例

    這篇文章主要為大家介紹了python使用aiohttp通過(guò)設(shè)置代理爬取基金數(shù)據(jù)簡(jiǎn)單示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • python如何發(fā)布自已pip項(xiàng)目的方法步驟

    python如何發(fā)布自已pip項(xiàng)目的方法步驟

    這篇文章主要介紹了python如何發(fā)布自已pip項(xiàng)目的方法步驟,方便大家學(xué)習(xí),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Php多進(jìn)程實(shí)現(xiàn)代碼

    Php多進(jìn)程實(shí)現(xiàn)代碼

    這篇文章主要介紹了Php多進(jìn)程實(shí)現(xiàn)編程實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • caffe binaryproto 與 npy相互轉(zhuǎn)換的實(shí)例講解

    caffe binaryproto 與 npy相互轉(zhuǎn)換的實(shí)例講解

    今天小編就為大家分享一篇caffe binaryproto 與 npy相互轉(zhuǎn)換的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • python獲取異常信息exc_info和print_exc的使用

    python獲取異常信息exc_info和print_exc的使用

    python通過(guò)sys.exc_info獲取異常信息,通過(guò)traceback.print_exc打印堆棧信息,包括錯(cuò)誤類型和錯(cuò)誤位置等信息,本文就來(lái)介紹一下具體用法,感興趣的可以了解一下
    2023-12-12
  • Django框架 信號(hào)調(diào)度原理解析

    Django框架 信號(hào)調(diào)度原理解析

    這篇文章主要介紹了Django框架 信號(hào)調(diào)度原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Windows平臺(tái)Python編程必會(huì)模塊之pywin32介紹

    Windows平臺(tái)Python編程必會(huì)模塊之pywin32介紹

    在Windows平臺(tái)上,從原來(lái)使用C/C++編寫(xiě)原生EXE程序,到使用Python編寫(xiě)一些常用腳本程序,成熟的模塊的使用使得編程效率大大提高了
    2019-10-10
  • Python利用prettytable庫(kù)輸出好看的表格

    Python利用prettytable庫(kù)輸出好看的表格

    prettytable庫(kù)就是這么一個(gè)工具,prettytable可以打印出美觀的表格,并且對(duì)中文支持相當(dāng)好。本文將介紹如何通過(guò)prettytable輸出好看的表格,需要的可以參考一下
    2022-01-01
  • python 編碼規(guī)范整理

    python 編碼規(guī)范整理

    這篇文章主要介紹了python 編碼規(guī)范整理,需要的朋友可以參考下
    2018-05-05

最新評(píng)論