进程间的通讯方式queue Pipe Manager

# coding: utf-8

# 共享全局变量在多进程中是不可用的, 可以适用于多线程 进程之间的数据是隔离的
# 可以用multiprocessing的Queue进行通讯


from multiprocessing import Process, Queue, Pool, Manager, Pipe
# 1. from queue import Queue   # 多进程当中不能用 from queue import Queue 应该用multiprocessing的Queue
# 2. multiprocessing中的Queue不能用于Pool创建的进程池的通讯
# 3. pool中的进程间通讯要使用到Manager 中的Queue  用法大概一样
# 4. 通过pipe来实现进程间通讯, pipe的性能要高于queue的  PS:只能用于2个进程通讯
# 5. Manager().dict()  的数据结构可以完成内存共享,但使用过程中要注意数据同步  用法几乎和线程一样 RLock




import time


"""queue"""
# def producer(queue):
#     queue.put('大哥我')
#     time.sleep(2)
#
#
# def consumer(queue):
#     time.sleep(2)
#     result = queue.get()
#     print(result)
#
#
# if __name__ == '__main__':
#     # queue = Queue(maxsize=10)
#     # producer_process = Process(target=producer, args=(queue, ))
#     # consumer_process = Process(target=consumer, args=(queue, ))
#     # producer_process.start()
#     # consumer_process.start()
#
#     queue = Manager().Queue(maxsize=10)
#     pool = Pool(2)
#     pool.apply_async(producer, args=(queue, ))
#     pool.apply_async(consumer, args=(queue, ))
#
#     pool.close()
#     pool.join()


"""pipe"""
# def producer(pipe):
#     pipe.send('大哥我')
#     time.sleep(2)
#
#
# def consumer(pipe):
#     time.sleep(2)
#     result = pipe.recv()
#     print(result)
#
#
# if __name__ == '__main__':
#     receive_pipe, send_pipe = Pipe()
#     # pipe只能用于2个进程间的通信
#     my_produce = Process(target=producer, args=(send_pipe, ))
#     my_consume = Process(target=consumer, args=(receive_pipe, ))
#     my_produce.start()
#     my_consume.start()
#
#     my_produce.join()
#     my_consume.join()


def add_data(p_dict, key, value):
    p_dict[key] = value


def get_data(p_dict, key):
    print(p_dict[key])
    del p_dict[key]


if __name__ == '__main__':
    process_dict = Manager().dict()
    for x in range(15):
        process1 = Process(target=add_data, args=(process_dict, 'bobby{}'.format(x), '19'))
        process1.start()
        process1.join()

    process2 = Process(target=add_data, args=(process_dict, 'bobby2', '22'))
    process3 = Process(target=get_data, args=(process_dict, 'bobby10'))


    process2.start()
    process3.start()
    process2.join()
    process3.join()
    print(process_dict)

猜你喜欢

转载自blog.csdn.net/weixin_34037173/article/details/91000561