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