1. 進程間的通訊
實現進程間的通訊(IPC)的方式有很多種,如:管道,消息隊列,共享內存,信號,信號量,套接字
管道 | 消息隊列 | 共享內存 | |
---|---|---|---|
開闢空間 | 內存 | 內存 | 內存 |
讀寫方式 | 兩端讀寫[雙向/單向] | 先進先出 | 覆蓋之前的內容 |
效率 | 一般 | 一般 | 較高 |
應用 | 多用於父子進程 | 廣泛靈活 | 需要注意互斥 |
本文僅記錄消息隊列學習內容。
2. 消息隊列
隊列:先進先出,按照順序來
通信原理:在內存中建立隊列數據結構模型。多個進程都可以通過隊列存入內容,取出內容的順序和存入的順序保持一致
3. 多進程消息隊列Python實現
#!/usr/bin/env python3
# -*- coding:UTF-8 -*-
from multiprocessing import Process, Pipe
import time
import os
import pickle, gzip
def save(filename, *objects):
#with open(filename, "wb", encoding="utf-8") as f:
fil = None
try:
fil = gzip.open(filename,'wb')
for obj in objects:
pickle.dump(obj,fil)
except Exception as e:
print (e)
finally:
if fil:
fil.close()
def load(filename):
fil = None
try:
fil = gzip.open(filename, 'rb')
return pickle.load(fil)
except Exception as e:
#print(e)
return None
finally:
if fil:
fil.close()
# 若將本地文件改爲網絡共享文件,則可實現分佈式環境多進程消息隊列模型
filename = "/tmp/test_msg.txt"
#多進程消息隊列傳遞數據
from multiprocessing import Queue,Process
from time import sleep
import multiprocessing
# 創建隊列,可以放3條消息
manager = multiprocessing.Manager()
q = manager.Queue(5)
def fun_product():
sleep(1)
while True:
info = load(filename)
if not info:
info = {"aa":1, "bb":2 }
print("_1_ create new info {}".format(info))
else:
print("_1_ product pre info {}".format(info))
aa = info['aa']
bb = info['bb']
info['aa'] = aa+2
info['bb'] = aa+3
print("_1_ product post info {}".format(info))
print("_1_ save info {}".format(info))
save(filename, info)
#q.put(info)
sleep(3)
def fun_get():
while True:
sleep(2)
info=load(filename)
if info:
#print("收到消息",q.__next__().get())
#print("q not None, but not get from it.")
print("_1_ load info", info)
else:
print("_1_ load info None")
p1 = Process(target = fun_product)
p2 = Process(target = fun_get)
# 生產者調用
p1.start()
p1.join()
# 消費者者調用
#p2.start()
#p2.join()