进程与进程之间的IPC通讯
队列知识补充
# 补充队列知识 import queue # 队列只能从第一个往后取值 q = queue.Queue() print(q) q.put(2) q.put(3) q.put(5) q.put(8) q.put(10) print(q.get()) print(q.get()) print(q.get())
IPC进程之间利用队列通信
# 进程之间的通信 # 进程池中的回调函数也可以实现进程之间的通信 # IPC Iter Process Communication # IPC :管道Pipe(没有锁,数据不安全的),管道 + 锁 == 队列 # 第三方工具(消息中间件) :memcache、redis、kafka、rabbitmq # 队列的用法 + 模型 from multiprocessing import Queue, Process def func(qu): msg = qu.get() print(msg) if __name__ == '__main__': q = Queue() # pickle + socket + Lock 进程之间数据安全的数据类型 pro = Process(target=func, args=(q,)) pro.start() q.put('hello')
通过manger加锁的方式实现进程之间的数据通信
from multiprocessing import Manager, Process, Lock def work(d, lock): lock.acquire() d['k1'] -= 1 lock.release() with lock: d['k2'] -= 1 if __name__ == '__main__': lock = Lock() m = Manager() dic = m.dict({'k1': 10, 'k2': 20}) p_l = [] for i in range(10): p = Process(target=work, args=(dic, lock)) p_l.append(p) p.start() for p in p_l: p.join() # 子进程不完成就一直在这阻塞 print(dic)

浙公网安备 33010602011771号