python实现进程通信_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()

程序输出:

ec6f594025054d4b83a12da3f74ce56b.png

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()

程序输出如下:

33c59c0a37cab8c5f910c28b23058c41.png

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

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

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值