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ú)效)
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-cXtoSmyN-1639571874327)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211215185302558.png)]](http://img.jbzj.com/file_images/article/202112/2021121610073124.png)
共享內(nèi)存
1.通信原理
在內(nèi)存中開(kāi)辟一塊空間,進(jìn)程可以寫(xiě)入內(nèi)容和讀取內(nèi)容完成通信,但是每次寫(xiě)入內(nèi)容會(huì)覆蓋之前內(nèi)容
2.實(shí)現(xiàn)方法
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-A5RVhKd1-1639571874328)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211215185911875.png)]](http://img.jbzj.com/file_images/article/202112/2021121610073125.png)
value ,array
from multiprocessing import Value,Array obj = Value(ctype,data) 功能: 開(kāi)辟共享內(nèi)存 參數(shù): ctype 表示共享內(nè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)存空間類型 '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é)果
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-BjnjTpgF-1639571874329)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211215203718835.png)]](http://img.jbzj.com/file_images/article/202112/2021121610073126.png)
到此這篇關(guān)于python中進(jìn)程間通信詳細(xì)介紹的文章就介紹到這了,更多相關(guān)python進(jìn)程間通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中opencv K均值聚類的實(shí)現(xiàn)示例
本文主要介紹了python中opencv K均值聚類的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Python使用unicodedata實(shí)現(xiàn)字符串標(biāo)準(zhǔn)化
這篇文章主要來(lái)和大家聊一聊 Python 的一個(gè)內(nèi)置模塊:unicodedata,它是專門(mén)用來(lái)處理 unicode 字符串的,下面就一起來(lái)看看它的用法吧2023-06-06
Python實(shí)現(xiàn)IP代理批量采集的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)IP代理批量采集,并檢測(cè)代理是否可用。文中的示例代碼講解詳細(xì),需要的可以參考一下2022-09-09
python使用pgzero進(jìn)行游戲開(kāi)發(fā)
今天要和大家分享的pgzero(pygame zero)是在pygame基礎(chǔ)上做了進(jìn)一步的封裝,使得設(shè)計(jì)一款游戲十分的方便,特別適合少兒編程領(lǐng)域的教學(xué), 與scratch相得益彰。2021-06-06
PyCharm安裝庫(kù)numpy失敗問(wèn)題的詳細(xì)解決方法
今天使用pycharm編譯python程序時(shí),由于要調(diào)用numpy包,但又未曾安裝numpy,于是就根據(jù)pycharm的提示進(jìn)行安裝,最后竟然提示出錯(cuò),下面這篇文章主要給大家介紹了關(guān)于PyCharm安裝庫(kù)numpy失敗問(wèn)題的詳細(xì)解決方法,需要的朋友可以參考下2022-06-06
淺談python已知元素,獲取元素索引(numpy,pandas)
今天小編就為大家分享一篇淺談python已知元素,獲取元素索引(numpy,pandas),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
python matplotlib imshow熱圖坐標(biāo)替換/映射實(shí)例
這篇文章主要介紹了python matplotlib imshow熱圖坐標(biāo)替換/映射實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03

