亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python進程間通訊與進程池超詳細講解

 更新時間:2022年12月23日 09:28:46   作者:alwaysrun  
進程彼此之間互相隔離,要實現(xiàn)進程間通信(IPC),multiprocessing模塊主要通過隊列方式,隊列:隊列類似于一條管道,元素先進先出,需要注意的一點是:隊列都是在內(nèi)存中操作,進程退出,隊列清空,另外,隊列也是一個阻塞的形態(tài)

在《多進程并發(fā)與同步》中介紹了進程創(chuàng)建與信息共享,除此之外python還提供了更方便的進程間通訊方式。

進程間通訊

multiprocessing中提供了Pipe(一對一)和Queue(多對多)用于進程間通訊。

隊列Queue

隊列是一個可用于進程間共享的Queue(內(nèi)部使用pipe與鎖),其接口與普通隊列類似:

put(obj[, block[, timeout]]):插入數(shù)據(jù)到隊列(默認阻塞,且沒有超時時間);

  • 若設(shè)定了超時且隊列已滿,會拋出queue.Full異常;
  • 隊列已關(guān)閉時,拋出ValueError異常

get([block[, timeout]]):讀取并刪除一個元素;

  • 若設(shè)定了超時且隊列為空,會拋出queue.Empty異常;
  • 隊列已關(guān)閉時,拋出ValueError異常;若已阻塞后,再關(guān)閉則會一直阻塞;

qsize():返回一個近似隊列長度(因多進程原因,長度會有誤差);

empty()/full():隊列空或慢(因多進程原因,會有誤差);

close():關(guān)閉隊列;

當主進程(創(chuàng)建Queue的)關(guān)閉隊列時,子進程中的隊列并沒有關(guān)閉,所以getElement進程會一直阻塞等待(為保證能正常退出,需要設(shè)為后臺進程):

def putElement(name, qu: multiprocessing.Queue):
    try:
        for i in range(10):
            qu.put(f"{name}-{i + 1}")
            time.sleep(.1)
    except ValueError:
        print("queue closed")
    print(f"{name}: put complete")
def getElement(name, qu: multiprocessing.Queue):
    try:
        while True:
            r = qu.get()
            print(f"{name} recv: {r}")
    except ValueError:
        print("queue closed")
    print(f"{name}: get complete")
if __name__ == '__main__':
    qu = multiprocessing.Queue(100)
    puts = [multiprocessing.Process(target=putElement, args=(f"send{i}", qu)) for i in range(10)]
    gets = [multiprocessing.Process(target=getElement, args=(f"recv{i}", qu), daemon=True) for i in range(2)]
    list(map(lambda f: f.start(), puts))
    list(map(lambda f: f.start(), gets))
    for f in puts:
        f.join()
    print("To close")
    qu.close() # 只是main中的close了,其他進程中的并沒有

管道Pipe

multiprocessing.Pipe([duplex])返回一個連接對象對(conn1, conn2)。若duplex為True(默認),創(chuàng)建的是雙向管道;否則conn1只能用于接收消息,conn2只能用于發(fā)送消息:

  • send():發(fā)送消息;
  • recv():接收消息;

進程間的Pipe基于fork機制建立:

  • 主進程創(chuàng)建Pipe:Pipe的兩個Connections連接的的都是主進程;
  • 創(chuàng)建子進程后,Pipe也被拷貝了一份:此時有了4個Connections;
  • 主進程關(guān)閉一個Out Connection,子進程關(guān)閉一個In Connection:就建立好了一個輸入在主進程,輸出在子進程的管道。
def pipeProc(pipe):
    outPipe, inPipe = pipe
    inPipe.close() # 必須關(guān)閉,否則結(jié)束時不會收到EOFError異常
    try:
        while True:
            r = outPipe.recv()
            print("Recv:", r)
    except EOFError:
        print("RECV end")
if __name__ == '__main__':
    outPipe, inPipe = multiprocessing.Pipe()
    sub = multiprocessing.Process(target=pipeProc, args=((outPipe, inPipe),))
    sub.start()
    outPipe.close() # 必須在進程成功運行后,才可關(guān)閉
    with inPipe:
        for x in range(10):
            inPipe.send(x)
            time.sleep(.1)
    print("send complete")
    sub.join()

進程池Pool

雖然使用多進程能提高效率,但進程的創(chuàng)建與銷毀會消耗較長時間;同時,過多進程會引起頻繁的調(diào)度,也增加了開銷。

進程池中有固定數(shù)量的進程:

  • 請求到來時,從池中取出一個進程來處理任務(wù);理完畢后,進程并不立即關(guān)閉,而是再放回進程池中;
  • 當池中進程數(shù)量不夠,請求就要等待,直到拿到空閑進程后才能繼續(xù)執(zhí)行;
  • 池中進程的數(shù)量是固定的,隱藏同一時間最多有固定數(shù)量的進程在運行。

multiprocessing.Pool([processes[, initializer[, initargs]]])

  • processes:要創(chuàng)建進程數(shù)量(默認os.cpu_count()個),在需要時才會創(chuàng)建;
  • initializer(*initargs):每個工作進程啟動時執(zhí)行的方法(一般processes為幾就執(zhí)行幾次);

Pool類中主要方法:

  • apply(func[, args[, kwds]]):以阻塞方式,從池中獲取進程并執(zhí)行func(*args,**kwargs);
  • apply_async(func[, args[, kwds[, callback[, error_callback]]]]):異步方式(從池中獲取一個進程)執(zhí)行func(*args,**kwargs),返回AsyncResult;
  • map(func, iterable[, chunksize])/map_async:map的并行版本(可同時處理多個任務(wù)),異步時返回MapResult;
  • starmap(func, iterable[, chunksize])/starmap_async:與map的區(qū)別是允許傳入多個參數(shù);
  • imap(func, iterable[, chunksize]):map的惰性版本(返回結(jié)果是可迭代對象),內(nèi)存消耗會低些,返回迭代器IMapIterator;
  • imap_unordered(func, iterable[, chunksize]):imap返回的結(jié)果順序與map順序是相同的,而此方法返回的順序是亂序的(不依次等待每個任務(wù)完成,先完成的先返回),返回迭代器IMapIterator;
  • close():關(guān)閉,禁止繼續(xù)提交任務(wù)(已提交任務(wù)會繼續(xù)執(zhí)行完成);
  • terminate():立即終止所有任務(wù);
  • join():等待工作進程完成(必須已close或terminate了);
def poolWorker():
    print(f"worker in process {os.getpid()}")
    time.sleep(1)
def poolWorkerOne(name):
    print(f"worker one {name} in process {os.getpid()}")
    time.sleep(random.random())
    return name
def poolWorkerTwo(first, second):
    res = first + second
    print(f"worker two {res} in process {os.getpid()}")
    time.sleep(1./(first+1))
    return res
def poolInit():
    print("pool init")
if __name__ == '__main__':
    workers = multiprocessing.Pool(5, poolInit) # poolInit會被調(diào)用5次(線程啟動時)
    with workers:
        for i in range(5):
            workers.apply_async(poolWorker)
        arg = [(i, i) for i in range(10)]
        workers.map_async(poolWorkerOne, arg)
        results = workers.starmap_async(poolWorkerTwo, arg) # 每個元素(元組)會被拆分為獨立的參數(shù)
        print("Starmap:", results.get())
        results = workers.imap_unordered(poolWorkerOne, arg)
        for r in results: # r是亂序的(若使用imap,則與輸入arg的順序相同)
            print("Unordered:", r)
    # 必須保證workers已close了
    workers.join()

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

相關(guān)文章

  • 使用Playwright進行視覺回歸測試詳解

    使用Playwright進行視覺回歸測試詳解

    這篇文章主要介紹了使用Playwright進行視覺回歸測試詳解,視覺回歸測試是一種軟件測試技術(shù),專注于檢測Web應(yīng)用程序或網(wǎng)站的用戶界面中的視覺變化和差異,需要的朋友可以參考下
    2023-08-08
  • python政策網(wǎng)字體反爬實例(附完整代碼)

    python政策網(wǎng)字體反爬實例(附完整代碼)

    大家好,本篇文章主要講的是python政策網(wǎng)字體反爬實例(附完整代碼),感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Python實現(xiàn)學(xué)生成績管理系統(tǒng)

    Python實現(xiàn)學(xué)生成績管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Python實現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • pytorch點乘與叉乘示例講解

    pytorch點乘與叉乘示例講解

    今天小編就為大家分享一篇pytorch點乘與叉乘示例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python時間管理黑科技之datetime函數(shù)詳解

    Python時間管理黑科技之datetime函數(shù)詳解

    在Python中,datetime模塊是處理日期和時間的標準庫,它提供了一系列功能強大的函數(shù)和類,用于處理日期、時間、時間間隔等,本文將深入探討datetime模塊的使用方法,感興趣的可以了解下
    2023-08-08
  • pytorch逐元素比較tensor大小實例

    pytorch逐元素比較tensor大小實例

    今天小編就為大家分享一篇pytorch逐元素比較tensor大小實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • 初步探究Python程序的執(zhí)行原理

    初步探究Python程序的執(zhí)行原理

    這篇文章主要介紹了Python程序的執(zhí)行原理,簡要地描述了其中的步驟,需要的朋友可以參考下
    2015-04-04
  • Pytorch實現(xiàn)將模型的所有參數(shù)的梯度清0

    Pytorch實現(xiàn)將模型的所有參數(shù)的梯度清0

    這篇文章主要介紹了Pytorch實現(xiàn)將模型的所有參數(shù)的梯度清0,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • numpy 數(shù)組拷貝地址所引起的同步替換問題

    numpy 數(shù)組拷貝地址所引起的同步替換問題

    本文主要介紹了numpy 數(shù)組拷貝地址所引起的同步替換問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Python(Tornado)模擬登錄小米搶手機

    Python(Tornado)模擬登錄小米搶手機

    用Python(Tornado)模擬登錄小米帳號,搶小米手機
    2013-11-11

最新評論