python 在进程间通信时有很多方式,比如使用Queue的消息队列,使用 pip的管道通信,share memory 共享内存或 semaphore 信号量等通信方式。

这里我们演示一下通过消息队列的方式进行进程间信息的传递。

from multiprocessing import Process,Queue
import time,random,os def wrtie(qu): # 写入数据
print("child_process write:")
for i in ["a","b","c","d","end"]:
print("写入数据....%s"%i)
qu.put(i) # 消息入队
time.sleep(random.random())
print("数据写入完成") def read(qu): # 读取数据
while qu.empty:
msg=qu.get()
if msg=="end":
print("读取结束")
break
print("读取数据 %s"%msg) if __name__=="__main__":
qu=Queue(100) # 100容量的数据
pw=Process(target=wrtie,args=(qu,))
pr=Process(target=read,args=(qu,))
pw.start()
pr.start()
pw.join()
pr.join()

输出结果:

写入数据....a
读取数据 a
写入数据....b
读取数据 b
写入数据....c
读取数据 c
写入数据....d
读取数据 d
写入数据....end
读取结束
数据写入完成

此外,如果我们想和python 程序外的一些程序进行数据通信的话,可以使用 subprocess 模块。

比如,使用我们的python 调出我们windows系统自带的计算器。

import subprocess as sp
sp.call(r"C:\Windows\System32\calc.exe",shell=True)

shell默认为False,在Linux下,shell=False时, Popen调用os.execvp()执行args指定的程序;shell=True时,如果args是字符串,Popen直接调用系统的Shell来执行args指定的程序,如果args是一个序列,则args的第一项是定义程序命令字符串,其它项是调用系统Shell时的附加参数,如在Linux下可以使用 call(["ls", "-l"]) 等同于在执行 ls -l 命令。

使用windows的ping命令,通过序列的方式(第一个为命令,第二个为参数)。

import subprocess as sp
res=sp.call(["ping","www.baidu.com"],shell=True)
输出:
���� Ping www.a.shifen.com [14.215.177.39] ���� 32 �ֽڵ�����:
���� 14.215.177.39 �Ļظ�: �ֽ�=32 ʱ��=47ms TTL=55
���� 14.215.177.39 �Ļظ�: �ֽ�=32 ʱ��=48ms TTL=55
���� 14.215.177.39 �Ļظ�: �ֽ�=32 ʱ��=47ms TTL=55
���� 14.215.177.39 �Ļظ�: �ֽ�=32 ʱ��=47ms TTL=55 14.215.177.39 �� Ping ͳ����Ϣ:
���ݰ�: �ѷ��� = 4���ѽ��� = 4����ʧ = 0 (0% ��ʧ)��
�����г̵Ĺ���ʱ��(�Ժ���Ϊ��λ):
��� = 47ms��� = 48ms��ƽ�� = 47ms

由于windows的CMD默认使用的是GBK编码,而Python中使用的是UTF-8编码,所以输出会部分乱码。

如果想获得进程执行后的结果可以使用 getoutput() 方法,他的返回值是一个字符串类型,保存着子进程执行的结果。

import subprocess as sp
# sp.call(r"C:\Windows\System32\calc.exe",shell=True)
# res=sp.getoutput("ping www.baidu.com")
res=sp.getoutput(["ping","www.baidu.com"])
print(res)
输出:
正在 Ping www.a.shifen.com [14.215.177.39] 具有 32 字节的数据:
来自 14.215.177.39 的回复: 字节=32 时间=49ms TTL=55
来自 14.215.177.39 的回复: 字节=32 时间=47ms TTL=55
来自 14.215.177.39 的回复: 字节=32 时间=47ms TTL=55
来自 14.215.177.39 的回复: 字节=32 时间=48ms TTL=55 14.215.177.39 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 47ms,最长 = 49ms,平均 = 47ms

提示:这里的 www.a.shifen.com 是百度的另一个域名,如果直接 ping baidu.com 显示的就是我们熟悉的百度域名了。

python学习笔记(十)——进程间通信的更多相关文章

  1. Python学习笔记(十二)—Python3中pip包管理工具的安装【转】

    本文转载自:https://blog.csdn.net/sinat_14849739/article/details/79101529 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...

  2. python学习笔记(十 一)、GUI图形用户界面

    python图形用户界面就是包含按钮.输入框.选择框等组件的窗口.主要依赖与工具包进行代码编写.python GUI工具包并发互斥的,你可以选择多个工具包进行安装,有极大选择空间.每个工具包都有不同用 ...

  3. python 学习笔记(十二) 文件和序列化

    python 文件读写和序列化学习.## python文件读写`1 打开并且读取文件` f = open('openfile.txt','r') print(f.read()) f.close() ` ...

  4. python 学习笔记十九 django深入学习四 cookie,session

    缓存 一个动态网站的基本权衡点就是,它是动态的. 每次用户请求一个页面,Web服务器将进行所有涵盖数据库查询到模版渲染到业务逻辑的请求,用来创建浏览者需要的页面.当程序访问量大时,耗时必然会更加明显, ...

  5. python 学习笔记十八 django深入学习三 分页,自定义标签,权限机制

    django  Pagination(分页) django 自带的分页功能非常强大,我们来看一个简单的练习示例: #导入Paginator>>> from django.core.p ...

  6. python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作

    django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...

  7. python 学习笔记十五 web框架

    python Web程序 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. Python的WEB框架分为两类: 自己写socket,自 ...

  8. python 学习笔记十五 django基础

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  9. python 学习笔记十四 jQuery案例详解(进阶篇)

    1.选择器和筛选器 案例1 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  10. python 学习笔记十二 html基础(进阶篇)

    HTML 超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准,它通过标记符号来标记要显示的网页中的各个部分.网页文件本身 是一种文本文件,通过在文本文件中添加标记符, 可以告诉浏览 ...

随机推荐

  1. Oracle数据库的下载、安装与卸载

    Oracle数据库下载: 这里以Oracle 11g为例,推荐去Oracle官网下载 Oracle官网下载地址:https://www.oracle.com/database/technologies ...

  2. 给bootstrap-table填坑

    由于设计变更,需要把数据由分页展示改为全部展示(才3500条数据),结果chrome浏览器页面卡顿,火狐浏览器直接卡死! console.time分析之后,竟然是bootstrap-table插件的坑 ...

  3. JAVA ArrayList集合底层源码分析

    目录 ArrayList集合 一.ArrayList的注意事项 二. ArrayList 的底层操作机制源码分析(重点,难点.) 1.JDK8.0 2.JDK11.0 ArrayList集合 一.Ar ...

  4. base64学习笔记

    关于是什么: 定义 8Bits字节编码方式之一 应用 传输8Bit字节代码 特性 Base64编码具有不可读性 描述 Base64可以成为密码学的基石,非常重要. 特点 可以将任意的二进制数据进行Ba ...

  5. linux作业--第四周

    1.自建yum仓库,分别为网络源和本地源 所有Yum仓库的配置文件均需以 .repo 结尾并存放在/etc/yum.repos.d/目录中的 [base] : yum仓库唯一标识符,避免与其它仓库冲突 ...

  6. Lua中如何实现类似gdb的断点调试—08支持通过包名称添加断点

    在前一篇中我们支持了通过函数名称来添加断点,我们同时也提到了在Lua中一个函数的名称的并不是确定的.准确的说,Lua中的函数并没有名称,所谓名称其实是保存这个函数值的变量的名称. 于是通过函数名称添加 ...

  7. vue+echarts可视化大屏,全国地图下钻,页面自适应

    之前写过一篇关于数据大屏及地图下钻的文章 https://www.cnblogs.com/weijiutao/p/13977011.html ,但是存在诸多问题,如地图边界线及行政区划老旧,无法自适应 ...

  8. CF416E题解

    题意:对于所有的 \((u,v)\),询问有多少条边在这两个点的最短路边集之并内. 考虑对于每一个 \(u\) 建立最短路 DAG 图,问题变成询问唯一的度数为 \(0\) 的节点到所有节点路径的并集 ...

  9. centos5 源失效解决办法

    将源文件备份 [base] name=CentOS-$releasever - Base failovermethod=priority baseurl=http://vault.centos.org ...

  10. Java子类继承父类的执行顺序

    父类的静态代码块(static) 子类的静态代码块(static) 父类的非静态代码块(父类成员初始化) 父类的构造方法 子类的非静态代码块(子类成员初始化) 子类的构造方法