进程间的通信

1.multiprocessing.Queue()

以Queue为例,在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据:

multiprcessing.Queue.put() 为 入队操作

multiprcessing.Queue.get() 为 出队操作

队列 线程 和 进程 安全

put(obj[, block[, timeout]])

将obj放入队列。 如果可选参数 block为True(默认值),timeout为None(默认值),则必要时阻止,直到空闲插槽可用。 如果超时是正数,它将阻止最多超时秒数,如果在该时间内没有空闲插槽可用,则会引发Queue.Full异常。 否则(块为False),如果空闲插槽立即可用,则将一个项目放在队列中,否则会引发Queue.Full异常(在这种情况下,忽略超时)。

get([block[, timeout]])

从队列中删除并返回一个项目。 如果可选的args块为True(默认值),超时为None(默认值),则在必要时阻止,直到项目可用。 如果超时为正数,则它将阻塞至多超时秒数,并在该时间内没有可用项目时引发Queue.Empty异常。 否则(block为False),如果一个项目立即可用,返回一个项目,否则会引发Queue.Empty异常(在这种情况下,忽略超时)。

from multiprocessing import Queue

q = Queue(5)

q.put('A')
q.put('F')
q.put('B')
q.put('C')
q.put('D')

print(q.qsize())
q.put('E', timeout=2)

 

q.full()用来判断队列是否已满

q.empty()判断队列是否是空的

 

 

 

# -*- coding:utf-8 -*-
from multiprocessing import Process, Queue
import os
import time
import random


# 写数据进程执行的代码
def write(q):
    print('Process to write: %s' % os.getpid())
    for value in ['A', 'B', 'C']:
        print('Put %s to queue...' % value)
        q.put(value)
        time.sleep(random.random())


# 读数据进程执行的代码
def read(q):
    print('Process to read: %s' % os.getpid())
    while True:
        value = q.get()
        print('Get %s from queue.' % value)


if __name__ == '__main__':
    # 父进程创建Queue,并传给各个子进程:
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))
    # 启动子进程pw,写入
    pw.start()
    # 启动子进程pr,读取
    pr.start()
    # 等待pw结束
    pw.join()
    # pr进程里是死循环,无法等待其结束,只能强行终止
    pr.terminate()

  输出:

参考文档:https://blog.csdn.net/HeatDeath/java/article/details/72844120

原文地址:https://www.cnblogs.com/GumpYan/p/12918960.html