最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python進(jìn)程間通信方式

 更新時(shí)間:2022年03月08日 09:07:37   作者:程序猿-張益達(dá)  
這篇文章主要介紹了Python進(jìn)程間通信方式,進(jìn)程彼此之間互相隔離,要實(shí)現(xiàn)進(jìn)程間通信,主要通過(guò)隊(duì)列方式,下文更多詳細(xì)內(nèi)容,需要的小伙伴可以參考一下

一、通信方式

進(jìn)程彼此之間互相隔離,要實(shí)現(xiàn)進(jìn)程間通信(IPC),multiprocessing模塊主要通過(guò)隊(duì)列方式

隊(duì)列:隊(duì)列類似于一條管道,元素先進(jìn)先出

需要注意的一點(diǎn)是:隊(duì)列都是在內(nèi)存中操作,進(jìn)程退出,隊(duì)列清空,另外,隊(duì)列也是一個(gè)阻塞的形態(tài)

二、Queue介紹

創(chuàng)建隊(duì)列的類(底層就是以管道和鎖定的方式實(shí)現(xiàn)):

Queue([maxsize]):創(chuàng)建共享的進(jìn)程隊(duì)列,Queue是多進(jìn)程安全的隊(duì)列,

可以使用Queue實(shí)現(xiàn)多進(jìn)程之間的數(shù)據(jù)傳遞。maxsize是隊(duì)列中允許最大項(xiàng)數(shù),省略則無(wú)大小限制。

三、方法介紹

  • def put(self, obj, block=True, timeout=None):插入數(shù)據(jù)到隊(duì)列中,Block值默認(rèn)為True,代表當(dāng)隊(duì)列已滿時(shí),會(huì)阻塞。如果block為False,則隊(duì)列滿會(huì)報(bào)異常Queue.Full,timeout表示會(huì)阻塞到指定時(shí)間,直到有剩余的空間供插入,如果時(shí)間超時(shí),則報(bào)異常Queue.Full
  •  def get(self, block=True, timeout=None):從隊(duì)列中取出數(shù)據(jù),Block值默認(rèn)為True,代表當(dāng)隊(duì)列為空時(shí),會(huì)阻塞。如果block為False,則隊(duì)列空會(huì)報(bào)異常Queue.Empty,timeout表示會(huì)等待到指定時(shí)間,直到取出數(shù)據(jù),如果時(shí)間超時(shí),則報(bào)異常Queue.Empty
  •  def empty(self): 判斷隊(duì)列是否為空,如果空返回True
  • def full(self): 判斷隊(duì)列是否已滿,如果滿返回True
  • def qsize(self): 返回隊(duì)列的大小

應(yīng)用舉例:

from multiprocessing import Process, Manager
q = Manager().Queue(2)
q.put(1)
q.put(2,block=False,timeout=2)
def func():
? ? print(q.get())
?
p = Process(target=func)
print("size",q.qsize())
print("full",q.full())
p.start()
p.join()
print("empty",q.empty())
print("get", q.get())
print("get", q.get(block=False,timeout=2))

輸出結(jié)果:

三、生產(chǎn)者和消費(fèi)者模型

在并發(fā)編程中使用生產(chǎn)者和消費(fèi)者模式能夠解決絕大多數(shù)并發(fā)問(wèn)題。該模式通過(guò)平衡生產(chǎn)線程和消費(fèi)線程的工作能力來(lái)提高程序的整體處理數(shù)據(jù)的速度。

為什么要使用生產(chǎn)者和消費(fèi)者模式?

在線程世界里,生產(chǎn)者就是生產(chǎn)數(shù)據(jù)的線程,消費(fèi)者就是消費(fèi)數(shù)據(jù)的線程。在多線程開(kāi)發(fā)當(dāng)中,如果生產(chǎn)者處理速度很快,而消費(fèi)者處理速度很慢,那么生產(chǎn)者就必須等待消費(fèi)者處理完,才能繼續(xù)生產(chǎn)數(shù)據(jù)。同樣的道理,如果消費(fèi)者的處理能力大于生產(chǎn)者,那么消費(fèi)者就必須等待生產(chǎn)者。為了解決這個(gè)問(wèn)題于是引入了生產(chǎn)者和消費(fèi)者模式。

四、什么是生產(chǎn)者消費(fèi)者模式

生產(chǎn)者消費(fèi)者模式是通過(guò)一個(gè)容器來(lái)解決生產(chǎn)者和消費(fèi)者的強(qiáng)耦合問(wèn)題。生產(chǎn)者和消費(fèi)者彼此之間不直接通訊,而通過(guò)阻塞隊(duì)列來(lái)進(jìn)行通訊:

生產(chǎn)者,只需要往隊(duì)列里面丟東西(生產(chǎn)者不需要關(guān)心消費(fèi)者)

消費(fèi)者,只需要從隊(duì)列里面拿東西(消費(fèi)者也不需要關(guān)心生產(chǎn)者)

阻塞隊(duì)列就相當(dāng)于一個(gè)緩沖區(qū),平衡了生產(chǎn)者和消費(fèi)者的處理能力。

實(shí)現(xiàn)方式一:Queue

from multiprocessing import Process,Manager,active_children
import random
import queue
import time
?
class Producer(Process):
?
? ? def __init__(self,queue):
? ? ? ? super().__init__()
? ? ? ? self.queue = queue
?
? ? def run(self):
? ? ? ? for i in range(6):
? ? ? ? ? ? r = random.randint(0, 99)
? ? ? ? ? ? time.sleep(1)
? ? ? ? ? ? self.queue.put(r)
? ? ? ? ? ? print("add data{}".format(r))
?
class Consumer(Process):
?
? ? def __init__(self,queue):
? ? ? ? super().__init__()
? ? ? ? self.queue = queue
?
? ? def run(self):
? ? ? ? while True:
? ? ? ? ? if not self.queue.empty():
? ? ? ? ? ? ? ? data = self.queue.get()
? ? ? ? ? ? ? ? print("minus data{}".format(data))
?
?
if __name__ == '__main__':
? ? q = Manager().Queue() # 創(chuàng)建隊(duì)列
? ? p = Producer(q)
? ? c = Consumer(q)
? ? p.start()
? ? c.start()
? ? print(active_children()) ?# 查看現(xiàn)有的進(jìn)程
? ? p.join()
? ? c.join()
? ? print("結(jié)束")
?
?
>>>輸出
[<ForkProcess(SyncManager-1, started)>, <Producer(Producer-2, started)>, <Consumer(Consumer-3, started)>]
add data83
minus data83
add data72
minus data72
add data8
minus data8
add data63
minus data63
add data75
minus data75
add data52
minus data52

實(shí)現(xiàn)方式二:利用JoinableQueue

JoinableQueue([maxsize]):一個(gè)Queue對(duì)象,但隊(duì)列允許項(xiàng)目的使用者通知生成者項(xiàng)目已經(jīng)被成功處理。通知進(jìn)程是使用共享的信號(hào)和條件變量來(lái)實(shí)現(xiàn)的。
JoinableQueue的實(shí)例除了與Queue對(duì)象相同的方法之外還具有:

     task_done():使用者使用此方法發(fā)出信號(hào),表示get()的返回項(xiàng)目已經(jīng)被處理。如果調(diào)用此方法的次數(shù)大于從隊(duì)列中刪除項(xiàng)目的數(shù)量,將引發(fā)ValueError異常

     join():生產(chǎn)者調(diào)用此方法進(jìn)行阻塞,直到隊(duì)列中所有的項(xiàng)目均被處理。阻塞將持續(xù)到隊(duì)列中的每個(gè)項(xiàng)目均調(diào)用task_done()方法為止

from multiprocessing import Process,JoinableQueue
import os
import time
import random
?
?
def print_log(msg, log_type="prod"):
? ? if log_type == 'prod':
? ? ? ? print("\033[32;1m%s\033[0m" %msg)
? ? elif log_type == 'con':
? ? ? ? print("\033[31;1m%s\033[0m" %msg)
?
def producer(q):
? ? """
? ? 生產(chǎn)者
? ? :param q:?
? ? :return:?
? ? """
? ? for i in range(10):
? ? ? ? data = random.randint(1,200)
? ? ? ? time.sleep(2)
? ? ? ? q.put(data) ?# 放入隊(duì)列
? ? ? ? msg = "add data {}".format(data)
? ? ? ? print_log(msg)
? ? q.join() ?# 生產(chǎn)者調(diào)用此方法進(jìn)行阻塞,直到隊(duì)列中所有的項(xiàng)目均被處理。
? ? # 阻塞將持續(xù)到隊(duì)列中的每個(gè)項(xiàng)目均調(diào)用q.task_done()方法為止
?
?
?
?
def consumer(q):
? ? """
? ? 消費(fèi)者
? ? :param q:?
? ? :return:?
? ? """
? ? while True:
? ? ? ? if not q.empty():
? ? ? ? ? ? time.sleep(5)
? ? ? ? ? ? data = q.get()
? ? ? ? ? ? msg = "minus data{}".format(data)
? ? ? ? ? ? print_log(msg,"con")
? ? ? ? ? ? q.task_done() ?# q.get()的返回項(xiàng)目已經(jīng)被處理
?
?
if __name__ == '__main__':
? ? q = JoinableQueue()
? ? prod = Process(target=producer, args=(q,))
? ? con = Process(target=consumer, args=(q,))
? ? con.daemon = True ?# 設(shè)置為守護(hù)進(jìn)程,但是不用擔(dān)心,producer內(nèi)調(diào)用q.join保證了consumer已經(jīng)處理完隊(duì)列中的所有元素
? ? # 開(kāi)啟進(jìn)程
? ? prod.start()
? ? con.start()
?
? ? prod.join() ?# 等待生產(chǎn)和消費(fèi)完成,主線程結(jié)束
? ? print("結(jié)束")

輸出結(jié)果:

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

相關(guān)文章

  • Python標(biāo)準(zhǔn)庫(kù)time使用方式詳解

    Python標(biāo)準(zhǔn)庫(kù)time使用方式詳解

    這篇文章主要介紹了Python標(biāo)準(zhǔn)庫(kù)time使用方式詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • Python用于學(xué)習(xí)重要算法的模塊pygorithm實(shí)例淺析

    Python用于學(xué)習(xí)重要算法的模塊pygorithm實(shí)例淺析

    這篇文章主要介紹了Python用于學(xué)習(xí)重要算法的模塊pygorithm,結(jié)合實(shí)例形式簡(jiǎn)單分析了pygorithm模塊的功能、算法調(diào)用、源碼獲取、時(shí)間復(fù)雜度計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • 關(guān)于數(shù)據(jù)分析Pandas的Series用法總結(jié)

    關(guān)于數(shù)據(jù)分析Pandas的Series用法總結(jié)

    這篇文章主要介紹了關(guān)于數(shù)據(jù)分析Pandas的Series用法總結(jié),Series序列,是一種一維的結(jié)構(gòu),類似于一維列表和ndarray中的一維數(shù)組,但是功能比他們要更為強(qiáng)大,Series由兩部分組成:索引index和數(shù)值values,本篇對(duì)其用法做出總結(jié)
    2023-07-07
  • Python中asyncio模塊使用詳解

    Python中asyncio模塊使用詳解

    Python中的asyncio模塊提供了異步IO支持,通過(guò)協(xié)程和事件循環(huán)實(shí)現(xiàn)異步編程,使用裝飾器@asyncio.coroutine可以定義協(xié)程,yield from語(yǔ)法用于調(diào)用其他協(xié)程并實(shí)現(xiàn)非阻塞等待,asyncio.sleep()模擬IO操作,通過(guò)并發(fā)執(zhí)行多個(gè)協(xié)程提高程序性能
    2024-10-10
  • Python 50行爬蟲(chóng)抓取并處理圖靈書(shū)目過(guò)程詳解

    Python 50行爬蟲(chóng)抓取并處理圖靈書(shū)目過(guò)程詳解

    這篇文章主要介紹了Python 50行爬蟲(chóng)抓取并處理圖靈書(shū)目過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 如何使用python批量修改文本文件編碼格式

    如何使用python批量修改文本文件編碼格式

    把文本文件的編碼格式進(jìn)行批量幻化,比如ascii, gb2312, utf8等,相互轉(zhuǎn)化,字符集的大小來(lái)看,utf8>gb2312>ascii,因此最好把gb2312轉(zhuǎn)為utf8,否則容易出現(xiàn)亂碼,這篇文章主要介紹了如何使用python批量修改文本文件編碼格式,需要的朋友可以參考下
    2023-03-03
  • 代碼分析Python地圖坐標(biāo)轉(zhuǎn)換

    代碼分析Python地圖坐標(biāo)轉(zhuǎn)換

    這篇文章主要介紹了Python地圖坐標(biāo)轉(zhuǎn)換的相關(guān)知識(shí)點(diǎn)以及分享了相關(guān)的代碼實(shí)例,對(duì)此有興趣的朋友學(xué)習(xí)下。
    2018-02-02
  • Python基礎(chǔ)教程,Python入門教程(超詳細(xì))

    Python基礎(chǔ)教程,Python入門教程(超詳細(xì))

    Python由荷蘭數(shù)學(xué)和計(jì)算機(jī)科學(xué)研究學(xué)會(huì) 于1990 年代初設(shè)計(jì),作為一門叫做ABC語(yǔ)言的替代品。Python語(yǔ)法和動(dòng)態(tài)類型,以及解釋型語(yǔ)言的本質(zhì),使它成為多數(shù)平臺(tái)上寫(xiě)腳本和快速開(kāi)發(fā)應(yīng)用的編程語(yǔ)言
    2021-06-06
  • Python使用爬蟲(chóng)抓取美女圖片并保存到本地的方法【測(cè)試可用】

    Python使用爬蟲(chóng)抓取美女圖片并保存到本地的方法【測(cè)試可用】

    這篇文章主要介紹了Python使用爬蟲(chóng)抓取美女圖片并保存到本地的方法,涉及Python基于正則、爬蟲(chóng)實(shí)現(xiàn)的圖片抓取與保存相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • Python解析JSON數(shù)據(jù)的示例代碼

    Python解析JSON數(shù)據(jù)的示例代碼

    JSON格式是網(wǎng)站和API使用的通用標(biāo)準(zhǔn)格式,現(xiàn)在主流的一些數(shù)據(jù)庫(kù)(如PostgreSQL)都支持JSON格式,在本文中,我們將介紹如何使用Python解析JSON數(shù)據(jù),感興趣的小伙伴跟著小編一起來(lái)看看吧
    2024-09-09

最新評(píng)論

渭南市| 穆棱市| 共和县| 平阳县| 凌源市| 青铜峡市| 焦作市| 黑龙江省| 怀来县| 普定县| 沛县| 梁平县| 玉环县| 桐柏县| 岚皋县| 开原市| 嵩明县| 务川| 海城市| 顺义区| 长治市| 长海县| 临潭县| 城固县| 博客| 平凉市| 桐梓县| 汉寿县| 洞头县| 亚东县| 晴隆县| 武平县| 荃湾区| 湛江市| 宁波市| 米泉市| 平和县| 双城市| 张家港市| 陆川县| 旅游|