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. linux常用命令与实例小全

    转至:https://www.cnblogs.com/xieguohui/p/8296864.html  linux常用命令与实例小全 阅读目录(Content) 引言 一.安装和登录 (一)    ...

  2. 深入Mybatis框架

    深入Mybatis框架 学习了Spring之后,我们已经了解如何将一个类作为Bean交由IoC容器管理,也就是说,现在我们可以通过更方便的方式来使用Mybatis框架,我们可以直接把SqlSessio ...

  3. WIN10:开机启动项设置

    搜索 config,在启动栏关闭要关闭的即可

  4. MySql的事务及数据的导入导出

    Mysql的事务及应用 1.补充数据库的导入与导出 导入 mysql -u root -p database < E:/SS/Test.sql -- 即执行sql文件 导出 -- 结构+数据 m ...

  5. python之random.seed()函数

    Python--random.seed()用法 第一次接触random.seed(),可能理解的不是特别对,大家欢迎指错,整理自网络,侵权删除 概念 seed()是改变随机数生成器的种子,可以在调用其 ...

  6. laravel 解决跨域问题并封装到中间件

    larav 官方手册有详细的步骤 https://learnku.com/articles/6504/laravel-cross-domain-solution 我们在用 laravel 进行开发的时 ...

  7. Linux命令,附带意思

    1.ls:命令是列出目录内容 2.lsblk:就是列出块设备3.md5sum:就是计算和检验MD5信息签名.4.dd:命令代表了转换和复制文件5.uname显示内核类别, uname -a显示详细信息 ...

  8. centos7 安装mysql Package: akonadi-mysql-1.9.2-4.el7.x86_64 (@anaconda)

    wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release ...

  9. C++ 接口的实现方式

    一.接口的定义 有时候,我们得提供一些接口给别人使用.接口的作用,就是提供一个与其他系统交互的方法.其他系统无需了解你内部细节,并且也无法了解内部细节,只能通过你提供 给外部的接口来与你进行通信.根据 ...

  10. Flink域名处理

    概述 最近做了一个小任务,要使用Flink处理域名数据,在4GB的域名文档中求出每个域名的顶级域名,最后输出每个顶级域名下的前10个子级域名.一个比较简单的入门级Flink应用,代码很容易写,主要用到 ...