资深程序员:深入Python进程间通信原理!

输出

3.14159262176

管道pipe

管道是Unix进程间通信最常用的方法之一,它通过在父子进程之间开通读写通道来进行双工交流。我们通过os.read()和os.write()来对文件描述符进行读写操作,使用os.close()关闭描述符。

上图为单进程的管道

上图为父子进程分离后的管道

输出

3.14159262176

无名套接字socketpair

我们知道跨网络通信免不了要通过套接字进行通信,但是本例的多进程是在同一个机器上,用不着跨网络,使用普通套接字进行通信有点浪费。

上图为单进程的socketpair

输出

3.14159262176

OS消息队列

操作系统也提供了跨进程的消息队列对象可以让我们直接使用,只不过python没有默认提供包装好的api来直接使用。我们必须使用第三方扩展来完成OS消息队列通信。第三方扩展是通过使用Python包装的C实现来完成的。

输出

3.14159262176

systemv消息队列systemv消息队列和posix消息队列用起来有所不同。systemv的消息队列是以整数key作为名称,如果不指定,它就创建一个唯一的未占用的整数key。它还提供消息类型的整数参数,但是不支持消息优先级。

# coding: utf-8import osimport sysimport mathimport structimport posix_ipcfrom posix_ipc import Semaphorefrom posix_ipc import SharedMemory as Memorydef slice(mink, maxk):s = 0.0for k in range(mink, maxk):s += 1.0/(2*k+1)/(2*k+1) return sdef pi(n):pids = []unit = n / 10sem_lock = Semaphore("/pi_sem_lock", flags=posix_ipc.O_CREX, initial_value=1) # 使用一个信号量控制多个进程互斥访问共享内存memory = Memory("/pi_rw", size=8, flags=posix_ipc.O_CREX)os.lseek(memory.fd, 0, os.SEEK_SET) # 初始化和为0.0的double值os.write(memory.fd, struct.pack(‘d‘, 0.0)) for i in range(10): # 分10个子进程mink = unit * imaxk = mink + unitpid = os.fork() if pid > 0:pids.append(pid) else:s = slice(mink, maxk) # 子进程开始计算sem_lock.acquire() try:os.lseek(memory.fd, 0, os.SEEK_SET)bs = os.read(memory.fd, 8) # 从共享内存读出来当前值cur_val, = struct.unpack(‘d‘, bs) # 反序列化,逗号不能少cur_val += s # 加上当前进程的计算结果bs = struct.pack(‘d‘, cur_val) # 序列化os.lseek(memory.fd, 0, os.SEEK_SET)os.write(memory.fd, bs) # 写进共享内存memory.close_fd() finally:sem_lock.release()sys.exit(0) # 子进程结束sums = [] for pid in pids:os.waitpid(pid, 0) # 等待子进程结束os.lseek(memory.fd, 0, os.SEEK_SET)bs = os.read(memory.fd, 8) # 读出最终这结果sums, = struct.unpack(‘d‘, bs) # 反序列化memory.close_fd() # 关闭共享内存memory.unlink() # 销毁共享内存sem_lock.unlink() # 销毁信号量return math.sqrt(sums * 8)print pi(10000000)

输出

3.14159262176

欢迎关注我的博客园和公众号:https://home.cnblogs.com/u/Python1234/ Python学习交流

欢迎加入我的千人交流学习答疑群:125240963

原文地址:https://www.cnblogs.com/Python1234/p/9100776.html

时间: 2024-08-01 20:56:57

资深程序员:深入Python进程间通信原理!的相关文章

月薪30k的资深程序员用Python爬取了知乎百万用户!并数据分析!

数据量:3,289,329 人. 数据采集工具:分布式 python 爬虫 分析工具:ElasticSearch + Kibana 分析角度:地理位置.男女比例.各类排名.所在高校.活跃程度等. 请各位注意: 以下所有分析结果都基于我抓取到的这300万用户的个人信息,非权威分析,仅供参考. 数据抓取时间为2017年7月份,用户数据会随着时间推移而变化,所以该报告具有一定时效性. 蓝色为男生,红色为女生.具体数据为: 男生:1,202,234 人,占 51.55%. 女生:1,129,874 人,

资深程序员用Python实现数据驱动的接口自动化测试!

2. 方案 针对上面的API,在做接口测试时,需要的测试用例动辄会多达10+, 这个时候采用数据驱动的方式将共性的内容写入配置文件或许会更合适. 这里考虑把API.参数.以及预期结果预行在格式化的CSV里保存,利用csv组件从CSV里读取URL.参数以及预期结果,Requests组件发起请求,将响应结果与预期结果进行比对,最后把比对结果写到结果CSV. 流程如下图 3. 实现 (1) 在上代码之前,先安装好如下几个组件: csv 读写CSV文件 json requests 发起请求,获取响应结果

我身边那些资深程序员,他们是怎么突破年薪百万的?

随着这两年,社交圈的扩大,也让我逐渐认识到了越来越多的年薪百万的资深程序员,也刷新了我过去无知的认知.他们其实非常低调,鲜有对外吹嘘自己收入,一直兢兢业业的在技术上驰骋人生,当然,这样的人已经是程序员中前10%了,绝大部分程序员的瓶颈在年薪60w-70w左右,就是天花板了,优秀的人总是喜欢和更优秀的人结交,因为总想上一个台阶.今天来分享下我认识的这些老司机是怎么突破年薪百万(这里的年薪百万以上就是工作的净值,不包含各种副业,各种投资理财带来的收益) 1.老司机A 背景:某TMD技术专家 学历:研

一位资深程序员大牛给予Java初学者的学习建议(转)

一位资深程序员大牛给予Java初学者的学习建议 这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议? 今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍.这一部分的内容, 同样适用于一些希望转行到Java的同学. 在大家看之前,我要先声明两点. 1.由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线, 非Java Web和Java后

转载:一位资深程序员大牛给予Java初学者的学习路线建议

一位资深程序员大牛给予Java初学者的学习路线建议 java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍.这一部分的内容,同样适用于一些希望转行到Java的同学. 在大家看之前,我要先声明两点.1.由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和J

【Python】Java程序员学习Python(五)— 函数的定义和使用

不想做一个待宰的羔羊!!!!要自己变得强大.... 函数的定义和使用放在最前边还是有原因的,现在语言趋于通用,基本类型基本都是那些,重点还是学习对象的使用方法,而最根本的还是方法的使用,因此优先介绍,方法的目的还是重用和封装 一.方法的定义 方法的定义使用关键词def来定义,定义格式如下: def 方法名(参数定义): 方法体 方法名:方法名的规范同变量名规范一样 参数定义:比较复杂,后面会进行讲解 冒号:这个类似于Java的{},必不可少 方法体:方法实现的功能在此定义即可 简单的例子: #定

给Lisp程序员的Python简介

给Lisp程序员的Python简介 作者:Peter Norvig,译者:jineslong<[email protected]> 这是一篇为Lisp程序员写的Python简介(一些Python程序员告诉我,这篇文章对他们学习Lisp也有帮助,尽管这不是我的本意).基本上,Python可以看作一个拥有“传统”语法(Lisp社区称之为“中缀”或者“m-lisp”语法)的Lisp方言.一个来自comp.lang.python的帖子说到“我一直不明白为什么LISP是一个不错的想法,直到我开始玩上了P

干货分享:十年大厂资深程序员的开发经验总结

本文由腾讯云加社区整理和发布,原文链接:cloud.tencent.com/developer/article/1004735,内容有删减和改动. 1.引言 在互联网一线做了十年的程序开发,经历了网易.百度.腾讯研究院.MIG 等几个地方,陆续做过 3D 游戏.2D 页游.浏览器.移动端翻译 app 等.积累了一些感悟,但必然有依然幼稚的地方,就当抛砖引玉,聊为笑谈. (本文同步发布于:http://www.52im.net/thread-2162-1-1.html) 2.关于作者 康亮: 腾讯

学Java的前景与就业,资深程序员教你怎么开始学Java!

IT行业一直是就业的热门岗位,程序员这个职业稳定性和收入比都有着不错的前景,那么学Java的前景和就业是什么样的呢?随着入行Java的准程序员越来越多,各种学习Java的流派也层出不穷!其实在编程的世界里,Java一直是企业级别开发最喜欢选择的编程语言,从java目前的就业形势来看还是相当不错的,由于手机安卓开发的需要,许多人也开始转战Java的学习. ? 从各种大型用人机构分析来说,银行.证券等等金融行业,阿里.京东等电商行业,移动.电信等通信行业,电.水.能源等公共服务行业,政府的电子政务,

java程序员自学python day01 认识python及环境搭建

一丶初来乍到: 首先感谢大家能来看我的博客,因为第一次写博客,之前没有经验,所以有不好的地方请大家指出来,当然初来乍到,肯定先要做个小小的自我介绍,本人是今年刚毕业的学生,在大学时期,因为当时看到学长学姐们找工作,都说java比较火,需求量大,所以自学了java,在java学习上,整整花费了两年的时间,现在也即将入职的是一份工作.作为一个程序员,想必大家都知道只会一门语言是远远不够的,因此,下定决心在业余的时间去学习python,把它当做自己的第二门语言,来丰富自己,提高自己的技能. 二丶认识p