python中進(jìn)程間通信詳細(xì)介紹
進(jìn)程間通信(IPC)
必要性
進(jìn)程間空間獨(dú)立,資源不共享,此時在需要進(jìn)程間數(shù)據(jù)傳輸時就需要特定的手段進(jìn)行數(shù)據(jù)通信
常用進(jìn)程間通信方法
管道 消息隊列 共享內(nèi)存 型號 信號量 套接字
管道通信(Pipe)
1.通信原理
在內(nèi)存中開辟管道空間,生成管道操作對象,多個進(jìn)程使用同一個管道對象進(jìn)行讀寫即可實(shí)現(xiàn)通信
代碼演示(windows 無效 linux 可用)
"""
pipe.py 管道通信
注意
1. multiprocessing 中管道通信只能用于有親緣關(guān)系進(jìn)程中
2. 管道對象在父進(jìn)程中創(chuàng)建,子進(jìn)程通過父進(jìn)程獲取
"""
from multiprocessing import Process, Pipe
# 創(chuàng)建 管道
fd1, fd2 = Pipe()
def app1():
print('1 啟動應(yīng)用1,請登錄')
print('2 請求app2授權(quán)')
fd1.send('app1 請求登錄')
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 啟動應(yīng)用1,請登錄
2 請求app2授權(quán)
2.5
3 app2 app1 請求登錄
4 app2,發(fā)送完畢
5 ?? ('Dave', '123')
6 登錄成功: ('Dave', '123')
0
運(yùn)行結(jié)束
"""
消息隊列
在內(nèi)存中建立隊列模型,進(jìn)程通過隊列將消息存入,或者從隊列取出完成 進(jìn)程間通信
2. 實(shí)現(xiàn)方法
"""
quque_test.py 消息隊列演示
注意: 消息隊列符合先進(jìn)先出原則
"""
# 創(chuàng)建消息隊列
from multiprocessing import Queue, Process
from random import randint
# 以下模擬 雙色球
# 創(chuàng)建消息隊列
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é)束')
控制臺輸出 linux (windows無效)
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(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)存中開辟一塊空間,進(jìn)程可以寫入內(nèi)容和讀取內(nèi)容完成通信,但是每次寫入內(nèi)容會覆蓋之前內(nèi)容
2.實(shí)現(xiàn)方法
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(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) 功能: 開辟共享內(nèi)存 參數(shù): ctype 表示共享內(nèi)存空間類型 'i' 'f' 'c' data 共享內(nèi)存空間初始數(shù)據(jù) 返回值: 共享內(nèi)存對象 obj.value 對象屬性的修改查看即對共享內(nèi)存讀寫 obj = Array(ctype,data) 功能: 開辟共享內(nèi)存 參數(shù): ctype 表示共享內(nèi)存空間類型 'i' 'f' 'c' data 整數(shù)表示開辟空間的大小,其數(shù)據(jù)表示開辟空間 返回值: 共享內(nèi)存對象 Array共享內(nèi)存讀寫:通過遍歷obj可以得到每個值,直接通過索引可以修改 * 可以使用obj.value 直接打印共享內(nèi)存中的字節(jié)串
value 代碼 演示
"""
value.py 開辟單一共享內(nèi)存空間
注意:共享內(nèi)存只能有一個值
"""
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 開辟單一共享內(nèi)存空間
注意:共享內(nèi)存只能有一個值
"""
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])
信號量(信號燈集)
1.通信原理
給定一個數(shù)量多多個進(jìn)程可見,多個進(jìn)程都可以操作該數(shù)增減,并根據(jù)數(shù)量值決定自己的行為
2. 實(shí)現(xiàn)方法
from multiprocessing import Semaphore sem = Semaphore(num) 功能: 創(chuàng)建信號量對象 參數(shù): 信號量的初始值 返回值: 信號量對象 sem.acquire() 信號量減1 當(dāng)信號量為0時阻塞 sem.release() 信號量加1 sem.get_value() 獲取信號量數(shù)量
3.代碼演示
"""
信號量.py 信號量演示
思路: 信號量數(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 開始執(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é)束')
控制臺運(yùn)行結(jié)果
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python被修飾的函數(shù)消失問題解決(基于wraps函數(shù))
這篇文章主要介紹了python被修飾的函數(shù)消失問題解決(基于wraps函數(shù)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11
使用python實(shí)現(xiàn)定時報天氣的示例代碼
本文主要介紹了使用python實(shí)現(xiàn)定時報天氣,只需要讓爬蟲程序每天自動為你發(fā)送,下面就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下2021-11-11

