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方法和遍历队列获取每一个队列中的值并输出。
在程序入口处先创建队列,声明进程池,在选择使用阻塞式模式创建进程,最后关闭子进程,结束父进程。
python进程间的通讯实现的更多相关文章
- 进程间的通讯(IPC)方式
内存映射 为什么要进行进程间的通讯(IPC (Inter-process communication)) 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间共享数据 ...
- [转]WINDOW进程间数据通讯以及共享内存
1.引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效地进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换,就如同 ...
- python 进程之间的通讯
python 进程之间的通讯 #!/usr/bin/env python #-*- coding:utf-8 -*- # author:leo # datetime:2019/5/28 10:15 # ...
- 【转】C++ 进程间的通讯(一):简单的有名管道实现
原文: C++ 进程间的通讯(一):简单的有名管道实现 -------------------------------------------------- 进程间的通讯(一):简单的有名管道实现 ...
- python进程间共享数值、字典、列表变量
##python进程间共享数值.字典.列表变量 关注公众号"轻松学编程"了解更多. import multiprocessing def worker(num, mgr_dict, ...
- 8.7 进程间的通讯:管道、消息队列、共享内存、信号量、信号、Socket
进程间的通讯 进程间为什么需要通讯? 共享数据.数据传输.消息通知.进程控制 进程间的通讯有哪些类型? 首先,联系前面讲过的知识,进程之间的用户地址空间是相互独立的,不能进行互相访问,但是,内核空间却 ...
- 进程间的通讯————IPC
""" IPC 指的是进程间通讯 之所以开启子进程 肯定需要它帮我们完成任务 很多情况下 需要将数据返回给父进程 然而 进程内存是物理隔离的 解决方案: 1.将共享数据放 ...
- python 进程间共享数据 (二)
Python中进程间共享数据,除了基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Mana ...
- .Net下的进程间的通讯 -- Windows消息队列
Windows 消息队列(MSMQ),是微软Windows2000以上的操作系统的一个服务,可以提供在计算机间消息的可靠传输,用来在两个进程间进行异步通讯最合适不过了.在.Net中有一个Message ...
随机推荐
- Pipeline模式与Factory+Provider模式的应用
前言 我正在写FastGithub这个小麻雀项目,里面主要涉及了Pipeline模式和Factory+Provider模式,这两种设计模式,让这个项目在"ip扫描"和"i ...
- conn / as sysdba连接不上
问题: SQL> conn / as sysdbaERROR:ORA-09817: Write to audit file failed.Linux-x86_64 Error: 28: No s ...
- 如何在国产龙芯架构平台上运行c/c++、java、nodejs等编程语言
高能预警:本文内容过于硬核,涉及编译器原理.cpu指令集.机器码.编程语言原理.跨平台原理等计算机专业基础知识,建议具有c.c++.java.nodejs等多种编程语言开发能力,且实战经验丰富的资深开 ...
- Mysql的5种索引添加类型
1.添加普通索引: alter table 'table_name' add index index_name('column') 2.添加主键索引 alter table 'table_name' ...
- gitla 报错 The project you were looking for could not be found or you don't have permission to view it.
gitlab项目组下创建项目 $ git push -u git@192.168.101.129:/DrvOps/Dev_Test : 报错信息如下: remote: ================ ...
- docker安装mysql镜像和容器
下拉镜像 docker pull mysql/mysql-server:5.5 后面的mysql标签是版本号,是可选择的,有: 5.5 5.6 5.7 8.0 创建mysql5.5的容器 docker ...
- spring 5 webflux异常处理
序 本文主要研究一下spring 5 webflux的异常处理 maven <dependency> <groupId>org.springframework.boot< ...
- 在 Docker 上配置 Oracle
地址:https://github.com/wnameless/docker-oracle-xe-11g .直接 git clone 到本地就行了 ##安装 docker shell 下: docke ...
- linux 操作目录
脚本 获取一个目录下各子目录中的文件个数 #!/bin/sh find /tmp/homework -maxdepth 1 -type d | while read dir; do count=$(f ...
- 25 Linux中的信号
Linux中的信号 信号是进程在运行过程中,由自身产生或由进程外部发过来的消息(事件).每个信号用一个整型常量宏表示,以SIG开头,比如SIGCHLD.SIGINT等,它们在系统头文件中定义,也可以通 ...