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

Python進程間通信方式

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

一、通信方式

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

隊列:隊列類似于一條管道,元素先進先出

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

二、Queue介紹

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

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

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

三、方法介紹

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

應(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ā)編程中使用生產(chǎn)者和消費者模式能夠解決絕大多數(shù)并發(fā)問題。該模式通過平衡生產(chǎn)線程和消費線程的工作能力來提高程序的整體處理數(shù)據(jù)的速度。

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

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

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

生產(chǎn)者消費者模式是通過一個容器來解決生產(chǎn)者和消費者的強耦合問題。生產(chǎn)者和消費者彼此之間不直接通訊,而通過阻塞隊列來進行通訊:

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

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

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

實現(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)建隊列
? ? p = Producer(q)
? ? c = Consumer(q)
? ? p.start()
? ? c.start()
? ? print(active_children()) ?# 查看現(xià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

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

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

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

     join():生產(chǎn)者調(diào)用此方法進行阻塞,直到隊列中所有的項目均被處理。阻塞將持續(xù)到隊列中的每個項目均調(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) ?# 放入隊列
? ? ? ? msg = "add data {}".format(data)
? ? ? ? print_log(msg)
? ? q.join() ?# 生產(chǎn)者調(diào)用此方法進行阻塞,直到隊列中所有的項目均被處理。
? ? # 阻塞將持續(xù)到隊列中的每個項目均調(diào)用q.task_done()方法為止
?
?
?
?
def consumer(q):
? ? """
? ? 消費者
? ? :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()的返回項目已經(jīng)被處理
?
?
if __name__ == '__main__':
? ? q = JoinableQueue()
? ? prod = Process(target=producer, args=(q,))
? ? con = Process(target=consumer, args=(q,))
? ? con.daemon = True ?# 設(shè)置為守護進程,但是不用擔(dān)心,producer內(nèi)調(diào)用q.join保證了consumer已經(jīng)處理完隊列中的所有元素
? ? # 開啟進程
? ? prod.start()
? ? con.start()
?
? ? prod.join() ?# 等待生產(chǎn)和消費完成,主線程結(jié)束
? ? print("結(jié)束")

輸出結(jié)果:

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

相關(guān)文章

  • python驗證碼識別教程之利用投影法、連通域法分割圖片

    python驗證碼識別教程之利用投影法、連通域法分割圖片

    這篇文章主要給大家介紹了關(guān)于python驗證碼識別教程之利用投影法、連通域法分割圖片的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起看看吧
    2018-06-06
  • Python+Qt相片更換背景顏色窗體程序的步驟詳解

    Python+Qt相片更換背景顏色窗體程序的步驟詳解

    QT+Python是非常經(jīng)典的窗體編程組合,功能完善,可視化界面美觀易維護,這篇博客針對相片更換背景顏色方面編寫代碼,代碼整潔,規(guī)則,易讀,對學(xué)習(xí)與使用Python有較好的幫助,需要的朋友可以參考下
    2022-12-12
  • python讀取dicom圖像示例(SimpleITK和dicom包實現(xiàn))

    python讀取dicom圖像示例(SimpleITK和dicom包實現(xiàn))

    今天小編就為大家分享一篇python讀取dicom圖像示例(SimpleITK和dicom包實現(xiàn)),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • PyTorch使用Tricks:Dropout,R-Dropout和Multi-Sample?Dropout方式

    PyTorch使用Tricks:Dropout,R-Dropout和Multi-Sample?Dropout方式

    這篇文章主要介紹了PyTorch使用Tricks:Dropout,R-Dropout和Multi-Sample?Dropout方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python實操練習(xí)案例(六)

    python實操練習(xí)案例(六)

    這篇文章主要介紹了python實操練習(xí)案例,前面也在陸續(xù)的向大家分享了python實操練習(xí)的案例,今天小編繼續(xù)向大家分享python實操練習(xí)案例的案例,需要的小伙伴可以參考一下
    2022-02-02
  • Python爬取科目四考試題庫的方法實現(xiàn)

    Python爬取科目四考試題庫的方法實現(xiàn)

    這篇文章主要介紹了Python爬取科目四考試題庫的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 人工智能學(xué)習(xí)Pytorch教程Tensor基本操作示例詳解

    人工智能學(xué)習(xí)Pytorch教程Tensor基本操作示例詳解

    這篇文章主要為大家介紹了人工智能學(xué)習(xí)Pytorch教程Tensor的基本操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • python如何使用opencv提取光流詳解

    python如何使用opencv提取光流詳解

    這篇文章主要給大家介紹了關(guān)于python如何使用opencv提取光流的相關(guān)資料,文中通過圖文以及實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-09-09
  • python之停止打印日志/重復(fù)打印日志方式

    python之停止打印日志/重復(fù)打印日志方式

    這篇文章主要介紹了python停止打印日志/重復(fù)打印日志方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 利用Python的PyPDF2庫提取pdf中的文字

    利用Python的PyPDF2庫提取pdf中的文字

    PyPDF2是一個用于處理PDF文件的Python庫,它提供了許多用于讀取和操作PDF文件的功能,對于需要處理PDF文件的Python應(yīng)用程序,PyPDF2是一個非常實用的工具庫,本文將給大家詳細(xì)介紹一下如何通過Python的PyPDF2庫提取pdf中的文字,需要的朋友可以參考下
    2023-05-05

最新評論