标签 多进程 下的文章

Python多进程间通信

前言

面试时被问到,没答上来后来搜了一下发现以前用过……好久没用忘了……

代码

进程间相互通信Python为我们提供了一个函数multiprocessing.Pipe和一个类:multiprocessing.Queue。

区别:

Pipe仅仅适用于只有两个进程一读一写的单双工情况,也就是说信息是只向一个方向流动。

Queue据官方文档也是基于pipe的实现。

Queue的使用主要是一边put(),一边get().但是Queue可以是多个Process 进行put操作,也可以是多个Process进行get()操作。

示例

# ! /usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Archerx
# @time: 2019/3/1 下午 04:58

from multiprocessing import Queue,Process
import random

def getter(name, queue):
    print ('Son process %s' % name)
    while True:
        try:
            value = queue.get(True, 10)
            # block为True,就是如果队列中无数据了。
            #   |—————— 若timeout默认是None,那么会一直等待下去。
            #   |—————— 若timeout设置了时间,那么会等待timeout秒后才会抛出Queue.Empty异常
            # block 为False,如果队列中无数据,就抛出Queue.Empty异常
            print ("Process getter get: %f" % value)
        except :
            break


def putter(name, queue):
    print ("Son process %s" % name)
    for i in range(0, 100):
        value = random.random()
        queue.put(value)
        # 放入数据 put(obj[, block[, timeout]])
        # 若block为True,如果队列是满的:
        #  |—————— 若timeout是默认None,那么就会一直等下去
        #  |—————— 若timeout设置了等待时间,那么会等待timeout秒后,如果还是满的,那么就抛出Queue.Full.
        # 若block是False,如果队列满了,直接抛出Queue.Full
        print ("Process putter put: %f" % value)


if __name__ == '__main__':
    queue = Queue()
    getter_process = Process(target=getter, args=("Getter", queue))
    putter_process = Process(target=putter, args=("Putter", queue))
    getter_process.start()
    putter_process.start()
    #下面是等待子进程结束
    # getter_process.join()
    # putter_process.join()
preView