python多进程————10、进程间的通信-Queue、Manager、Pipe

一、Queue

这里提到的队列模块大概有三个:

 1、from queue import Queue  (此模块适用于线程间通信,但不能用于进程间通信)

 2、from multiprocessing import Queue (可以用于多进程,但不能用于进程池)

import time
from multiprocessing import Process,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.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()
#使用queue模块的Queue()会报错
#使用multiprocessing中的Queue(),正确输出a


 3、from multiprocessing import Mnage

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__":
    #queue = Queue()
    queue = Manager().Queue()
    pool = Pool()
#pool中的进程间通信需要使用Manager
    pool.apply_async(producer,args=(queue,))
    pool.apply_async(consumer, args=(queue,))
    pool.close()
    pool.join()

 

二、共享变量

      共享变量不适用于多进程,进程间的变量是互相隔离的,子进程的全局变量是完全复制一份父进程的数据,对子进程的全局变量修改完全影响不到其他进程的全局变量

def producer(a):
    a += 1
    time.sleep(2)

def consumer(a):
    time.sleep(3)
    data = a
    print(data)

if __name__ == "__main__":
    a = 1
    my_producer = Process(target=producer,args=(a,))
    my_consumer = Process(target=consumer,args=(a,))
    my_producer.start()
    my_consumer.start()
    my_producer.join()
    my_consumer.join()

#输出结果为1

三、管道Pipe(两进程间的通信优先考虑)

import time
from multiprocessing import Process,Queue,Pool,Manager,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()

四、Manager

manager中的一些数据结构,dict使用(类似共享变量)

import time
from multiprocessing import Process,Queue,Pool,Manager,Pipe
import queue
def add_data(p_dict,key,value):
    p_dict[key] = value
if __name__ == "__main__":
    progress = Manager().dict()
    first_progress = Process(target=add_data,args=(progress,"a",1))
    second_process = Process(target=add_data,args=(progress,"b",2))
    first_progress.start()
    second_process.start()
    first_progress.join()
    second_process.join()
    print(progress)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值