Python多進程消息隊列實現進程間通訊

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()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章