python进程间的通讯实现

1:进程间通讯的方法:apply_async()非阻塞式通讯     apply()阻塞式通讯

2:使用Queue实现对Process创建的进程间通讯,

Queue本身是一个消息队列程序,Queue常用方法: 

Queue.qsize():返回当前消息队列的消息数量
Queue.empty():如果队列为空,返回true 否则返回false
Queue.full():如果队列满了,返回true,否则false
Queue.get():获取队列中的一条消息,然后将其从队列中移除
Queue.put(“xxx”):把内容存放进消息队列
Queue.get_nowait()相当于Queue.get(False)    Queue.put_nowait()相当于Queue.put(False)

例子:

#叫做队列
from multiprocessing import  Queue
from multiprocessing import  Process
list = ["lipeng","王五","赵四"]
def write(q):
    for temp in list:
        print("---%s write to queue"%temp)
        q.put(temp)
def read(q):
    while 1:
        if  not q.empty():
            value = q.get()
            print("--get %s from queue"%value)
        else:
            print("queue is  empty")
            break

if __name__ == '__main__':
    q = Queue()
    pw = Process(target=write,args=(q,))
    pr = Process(target=read,args=(q,))
    pw.start()#启动子进程,开始写
    pw.join()#等待pw进程结束
    pr.start()
    pr.join()

程序输出:

3: 进程池间通讯方式的实现

Process创建的进程可以使用Queue进行通讯,而进程池Pool创建的进程通讯使用Manager中的Queue来初始化,就不需要再导入Queue模块。

先看例子:

​​from multiprocessing import Pool,Manager
#from multiprocessing import Queue
def write(q):#定义写入队列的函数
    list = ["111", "222", "555", "666"]

    if not q.full():
        for temp in list:
            print("write  %s to Queue"%temp)
            q.put(temp)
    else:
         print("queue is full")

def read(q):
    while True:
        if not q.empty():
            value = q.get()
            print("get %s from queue"%value)
        else:

            print("queue ir empty")
            print("所有数据读写完毕")
            break

if __name__ == '__main__':
    #创建队列
    q = Manager().Queue()#使用Manager中的Queue来初始化
    #创建写进程
    po = Pool()
    #使用阻塞模式创建进程,这样就不需要在read中使用死循环,可以让write执行完成后再用read进程
    po.apply(write,(q,))
    po.apply(read,(q,))
    po.close()
    po.join()

 程序输出如下:

很累很累,但我还是要解释一下这个代码:

首先导入mutiprocessing模块下的Process类Manager类,定义write函数实现把数据写入队列,定义read函数实现对队列中的消息进行读取。

在write函数中以队列q(使用Manager中的Queue来初始化),判断队列是否满,遍历要写入的数据使用put方法写入。否则输出队列已满

在read函数中以队列q(使用Manager中的Queue来初始化),判断队列时候是空,使用get方法和遍历队列获取每一个队列中的值并输出。

在程序入口处先创建队列,声明进程池,在选择使用阻塞式模式创建进程,最后关闭子进程,结束父进程。

猜你喜欢

转载自blog.csdn.net/peng_for_csdn/article/details/88902350