32 进程之间的通信

进程间通信(Inter-Porcess Communication,简称IPC),首先要了解队列,它是先进先出的。通过from multiprocessing import Queue来使用。

from multiprocessing import Queue
q = Queue(6)
for i in range(6):
    q.put(i)
    print('%d放入队列'%i)
print('********************************')
while True:
    print(q.get())

通过队列,让两个子进程之间进行通信。

from multiprocessing import Queue,Process
def produce(q):
    q.put('hello')
def consume(q):
    print(q.get())
if __name__ == '__main__':
    q = Queue()
    p = Process(target=produce,args=(q,))
    p.start()
    p1 = Process(target=consume,args=(q,))
    p1.start()
生产者、消费者模型

一个队列是进程安全的,一个队列中的数据只能被一个进程请求数据。

from multiprocessing import Queue,Process
import time,random
def producer(name,food,q):
    for i in range(10):
        time.sleep(random.randint(1,3))
        f = '%s生产了%s%s'%(name,food,i)
        print(f)
        q.put(f)

def consumer(q,name):
    while True:
        food = q.get()
        if food is None:
            print('获取到一个空')
            break
        print('%s消费了%s'%(name,food))
        time.sleep(random.randint(1,3))

if __name__ == '__main__':
    q = Queue()
    p1 = Process(target=producer,args=('张三','包子',q))
    p2 = Process(target=producer,args=('李四','胡辣汤',q))
    c1 = Process(target=consumer,args=(q,'王五'))
    c2 = Process(target=consumer,args=(q,'yan五'))
    p1.start()
    p2.start()
    c1.start()
    c2.start()
    p1.join()
    p2.join()
    q.put(None)
    q.put(None)

JoinableQueue

from multiprocessing import JoinableQueue,Process
def producer(name,food,q):
    for i in range(10):
        time.sleep(random.randint(1,3))
        f = '%s生产了%s%s'%(name,food,i)
        print(f)
        q.put(f)
    q.join()    #JoinableQueue的join代表阻塞 感知一个队列中的数据全部被执行完毕。

def consumer(q,name):
    while True:
        food = q.get()
        print('%s消费了%s'%(name,food))
        time.sleep(random.randint(1,3))
        q.task_done()   #提交一个回值,对q中的值的个数减一。
if __name__ == '__main__':
    q = JoinableQueue()
    p1 = Process(target=producer,args=('张三','包子',q))
    p2 = Process(target=producer,args=('李四','胡辣汤',q))
    c1 = Process(target=consumer,args=(q,'王五'))
    c2 = Process(target=consumer,args=(q,'yan五'))
    p1.start()
    p2.start()
    c1.daemon = True    #设置为守护进程,主进程代码执行完毕之后,子进程自动结束。
    c2.daemon = True
    c1.start()
    c2.start()
    p1.join()
    p2.join()   #进程的join是感知一个进程的结束

在消费者端:

  • 每次获取一个数据,发送一个记号,即:q.task_done(),标志一个数据被处理成功。

在生产者端:

  • 每生产一个数据,放入到队列中,并对数据做一个数据,当生产者生产完所有的数据,join信号已经停止生产数据,却要等待数据被消耗完,当数据都被处理完,join阻塞结束。

  • consumer中把所有的任务消耗完

  • producer的join感知到,阻塞停止

  • 所有的producer进程结束

  • 主进程中的p.join结束

  • 主进程中代码结束

  • 守护进程(消费者的进程)结束

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值