Python 进程间通信- Queue, Pipe, Manager

回顾线程间通信(Python多线程编程之线程间通信),线程间通信用共享变量和queue.Queue。但这两者都不能用于进程间通信。不同进程之间,变量就算同名也是位于不同的内存地址上,也是不同的变量。queue.Queue 也不能用于进程间通信,将不同进程的变量put进queue.Queue对象中,会抛弃常。下面示例代码:

from queue import Queue

def producer(queue):
    queue.put("a")
    time.sleep(2)

def consumer(queue):
    time.sleep(2)
    data = queue.get()
    print(data)

if __name__ == "__main__":
    queue = Queue(10)
    my_producer = Process(target=producer, args=(queue,))
    my_consumer = Process(target=consumer, args=(queue,))
    my_producer.start()
    my_consumer.start()
    my_producer.join()
    my_consumer.join()

# 运行结果,抛异常退出

1. from multiprocessing import Queue ,multiprocessing 中的 Queue, 不能用于 pool 进程池。

import time
from multiprocessing import Process,Queue

 
def producer(queue):
    queue.put("a")
    time.sleep(2)
 
def consumer(queue):
    time.sleep(2)
    data = queue.get()
    print(data)
 
if __name__ == "__main__":
    #queue = queue.Queue()
    queue = Queue()
    my_producer = Process(target=producer,args=(queue,))
    my_consumer = Process(target=consumer,args=(queue,))
    my_producer.start()
    my_consumer.start()
    my_producer.join()
    my_consumer.join()

"""
运行结果:
a

Process finished with exit code 0
"""
# 使用 multiprocessing.Queue 可以正常实现进程间通信,正常打印出 “a”

2. from multiprocessing import Manager(实例化后调用Queue()可以用于多进程的进程池)

import time
from multiprocessing import Process,Queue,Pool,Manager
 
 
def producer(queue):
    queue.put("a")
    time.sleep(2)
 
def consumer(queue):
    time.sleep(2)
    data = queue.get()
    print(data)
 
if __name__ == "__main__":
	#pool中的进程间通信需要先实例化Manager,再调用Queue()
    queue = Manager().Queue()
    pool = Pool()

    pool.apply_async(producer,args=(queue,))
    pool.apply_async(consumer, args=(queue,))
    pool.close()
    pool.join()

"""
a

Process finished with exit code 0
"""

3. 管道 Pipe (两进程间的通信优先考虑), pipe的性能高于queue, 因为 queue要加了很多锁。

import time
from multiprocessing import Pool, Pipe


def producer(pipe):
    pipe.send("a")
    time.sleep(3)
    print(pipe.recv())

def consumer(pipe):
    time.sleep(2)
    data = pipe.recv()
    pipe.send("b")
    print(data)

if __name__ == "__main__":
    # Pipe实现两进程间通信
    s_pipe, r_pipe = Pipe()
    pool = Pool()
    pool.apply_async(producer, args=(s_pipe,))
    pool.apply_async(consumer, args=(r_pipe,))
    pool.close()
    pool.join()

"""
运行结果:
a
b

Process finished with exit code 0
"""

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值