进程与进程之间的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)

 

posted @ 2019-01-27 11:27  平平无奇小辣鸡  阅读(240)  评论(0)    收藏  举报