python中進(jìn)程間通信詳細(xì)介紹
進(jìn)程間通信(IPC)
必要性
進(jìn)程間空間獨(dú)立,資源不共享,此時(shí)在需要進(jìn)程間數(shù)據(jù)傳輸時(shí)就需要特定的手段進(jìn)行數(shù)據(jù)通信
常用進(jìn)程間通信方法
管道 消息隊(duì)列 共享內(nèi)存 型號(hào) 信號(hào)量 套接字
管道通信(Pipe)
1.通信原理
在內(nèi)存中開(kāi)辟管道空間,生成管道操作對(duì)象,多個(gè)進(jìn)程使用同一個(gè)管道對(duì)象進(jìn)行讀寫(xiě)即可實(shí)現(xiàn)通信
代碼演示(windows 無(wú)效 linux 可用)
""" pipe.py 管道通信 注意 1. multiprocessing 中管道通信只能用于有親緣關(guān)系進(jìn)程中 2. 管道對(duì)象在父進(jìn)程中創(chuàng)建,子進(jìn)程通過(guò)父進(jìn)程獲取 """ from multiprocessing import Process, Pipe # 創(chuàng)建 管道 fd1, fd2 = Pipe() def app1(): print('1 啟動(dòng)應(yīng)用1,請(qǐng)登錄') print('2 請(qǐng)求app2授權(quán)') fd1.send('app1 請(qǐng)求登錄') data = fd1.recv() print('5 ??',data) if data: print('6 登錄成功:', data) def app2(): print('2.5') # 阻塞等待讀取管道內(nèi)容 data = fd2.recv() print('3 app2', data) fd2.send(('Dave', '123')) print('4 app2,發(fā)送完畢') if __name__ == '__main__': print(-5) p1 = Process(target=app1) print(-4) p2 = Process(target=app2) print(-3) p1.start() print(-2) p2.start() print(-1) p1.join() print(0) p2.join() print('運(yùn)行結(jié)束') """ 運(yùn)行結(jié)果 (base) [root@VM-0-12-centos pipe]# python pipe.py -5 -4 -3 -2 -1 1 啟動(dòng)應(yīng)用1,請(qǐng)登錄 2 請(qǐng)求app2授權(quán) 2.5 3 app2 app1 請(qǐng)求登錄 4 app2,發(fā)送完畢 5 ?? ('Dave', '123') 6 登錄成功: ('Dave', '123') 0 運(yùn)行結(jié)束 """
消息隊(duì)列
在內(nèi)存中建立隊(duì)列模型,進(jìn)程通過(guò)隊(duì)列將消息存入,或者從隊(duì)列取出完成 進(jìn)程間通信
2. 實(shí)現(xiàn)方法
""" quque_test.py 消息隊(duì)列演示 注意: 消息隊(duì)列符合先進(jìn)先出原則 """ # 創(chuàng)建消息隊(duì)列 from multiprocessing import Queue, Process from random import randint # 以下模擬 雙色球 # 創(chuàng)建消息隊(duì)列 q = Queue(5) def handle(): print(5) for i in range(6): q.put(randint(1, 33)) q.put(randint(1, 16)) def request(): print(6) l = [q.get() for i in range(6)] l.sort() l.append(q.get()) print(7,l) if __name__ == '__main__': print(0) p1 = Process(target=handle) print(1) p2 = Process(target=request) print(2) p1.start() print(3) p2.start() print(4) p1.join() p2.join() print(8) print('程序結(jié)束')
控制臺(tái)輸出 linux (windows無(wú)效)
共享內(nèi)存
1.通信原理
在內(nèi)存中開(kāi)辟一塊空間,進(jìn)程可以寫(xiě)入內(nèi)容和讀取內(nèi)容完成通信,但是每次寫(xiě)入內(nèi)容會(huì)覆蓋之前內(nèi)容
2.實(shí)現(xiàn)方法
value ,array
from multiprocessing import Value,Array obj = Value(ctype,data) 功能: 開(kāi)辟共享內(nèi)存 參數(shù): ctype 表示共享內(nèi)存空間類(lèi)型 'i' 'f' 'c' data 共享內(nèi)存空間初始數(shù)據(jù) 返回值: 共享內(nèi)存對(duì)象 obj.value 對(duì)象屬性的修改查看即對(duì)共享內(nèi)存讀寫(xiě) obj = Array(ctype,data) 功能: 開(kāi)辟共享內(nèi)存 參數(shù): ctype 表示共享內(nèi)存空間類(lèi)型 'i' 'f' 'c' data 整數(shù)表示開(kāi)辟空間的大小,其數(shù)據(jù)表示開(kāi)辟空間 返回值: 共享內(nèi)存對(duì)象 Array共享內(nèi)存讀寫(xiě):通過(guò)遍歷obj可以得到每個(gè)值,直接通過(guò)索引可以修改 * 可以使用obj.value 直接打印共享內(nèi)存中的字節(jié)串
value 代碼 演示
""" value.py 開(kāi)辟單一共享內(nèi)存空間 注意:共享內(nèi)存只能有一個(gè)值 """ from multiprocessing import Value,Array,Process import time import random ctype = 'i' data = 5000 # 創(chuàng)建共享內(nèi)存 money = Value(ctype,data) # 操作共享內(nèi)存 def man(): for i in range(30): time.sleep(0.1) money.value += random.randint(1,1000) print('man',money.value) def girl(): for i in range(30): time.sleep(0.1) money.value -= random.randint(1,800) print('girl', money.value) if __name__ == '__main__': p1 = Process(target=man) p2 = Process(target=girl) p1.start() p2.start() p1.join() p2.join() print('程序結(jié)束',money.value)
array 代碼演示
""" array.py 開(kāi)辟單一共享內(nèi)存空間 注意:共享內(nèi)存只能有一個(gè)值 """ from multiprocessing import Array,Process ctype = 'i' data = [1,2,3,4] # 創(chuàng)建共享內(nèi)存 # shm = Array(ctype,data) # 表示初始值 [0,0,0,0,0] shm = Array(ctype,5) def fun(): for i in shm: print(i) shm[1] = 1000 if __name__ == '__main__': p1 = Process(target=fun) p1.start() p1.join() print('程序結(jié)束',shm[1])
信號(hào)量(信號(hào)燈集)
1.通信原理
給定一個(gè)數(shù)量多多個(gè)進(jìn)程可見(jiàn),多個(gè)進(jìn)程都可以操作該數(shù)增減,并根據(jù)數(shù)量值決定自己的行為
2. 實(shí)現(xiàn)方法
from multiprocessing import Semaphore sem = Semaphore(num) 功能: 創(chuàng)建信號(hào)量對(duì)象 參數(shù): 信號(hào)量的初始值 返回值: 信號(hào)量對(duì)象 sem.acquire() 信號(hào)量減1 當(dāng)信號(hào)量為0時(shí)阻塞 sem.release() 信號(hào)量加1 sem.get_value() 獲取信號(hào)量數(shù)量
3.代碼演示
""" 信號(hào)量.py 信號(hào)量演示 思路: 信號(hào)量數(shù)量相當(dāng)于資源,執(zhí)行任務(wù)必須消耗資源 """ import os from multiprocessing import Semaphore from multiprocessing import Process from time import sleep num = 3 sem = Semaphore(num) # 任務(wù)函數(shù) def handle(): sem.acquire() # sem -1 print("%s 開(kāi)始執(zhí)行任務(wù)" % os.getpid()) sleep(3) print("%s 執(zhí)行任務(wù)完畢" % os.getpid()) sem.release() # sem +1 if __name__ == '__main__': ths = [] for i in range(10): p = Process(target=handle) p.start() ths.append(p) for p in ths: p.join() print('程序結(jié)束')
控制臺(tái)運(yùn)行結(jié)果
到此這篇關(guān)于python中進(jìn)程間通信詳細(xì)介紹的文章就介紹到這了,更多相關(guān)python進(jìn)程間通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何用Python來(lái)搭建一個(gè)簡(jiǎn)單的推薦系統(tǒng)
這篇文章主要介紹了如何用Python來(lái)搭建一個(gè)簡(jiǎn)單的推薦系統(tǒng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python自動(dòng)化測(cè)試中yaml文件讀取操作
這篇文章主要介紹了Python自動(dòng)化測(cè)試中yaml文件讀取操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08python被修飾的函數(shù)消失問(wèn)題解決(基于wraps函數(shù))
這篇文章主要介紹了python被修飾的函數(shù)消失問(wèn)題解決(基于wraps函數(shù)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11使用python實(shí)現(xiàn)定時(shí)報(bào)天氣的示例代碼
本文主要介紹了使用python實(shí)現(xiàn)定時(shí)報(bào)天氣,只需要讓爬蟲(chóng)程序每天自動(dòng)為你發(fā)送,下面就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下2021-11-11python中的計(jì)時(shí)器timeit的使用方法
本篇文章主要介紹了python中的計(jì)時(shí)器timeit的使用方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10