python学习第三十二节(进程间通信、进程池、协程)

当多线程创建完毕之后,start并没有了立刻运行,依旧需要和其他线程抢CPU的资格,只是
时间很短。
进程之间的通信分为两种,queue和pipe

 1 import multiprocessing
 2 def foo(q):
 3     q.put([1,'hello',True])
 4 if __name__=='__main__':
 5     q=multiprocessing.Queue()#通过multiprocessing建立一个队列
 6     p=multiprocessing.Process(target=foo,args=(q,))
 7   #用multiprocessing在调用Process,建立一个子进程,定义函数名,将q作为参数传到foo函数,
 8     #foo函数就可以通过这个参数来与主进程做交互了。
 9     p.start()#激活这个子进程
10     print(q.get())#主进程

上面函数通过multiprocessing的queue来实现进程间通信。

 1 from multiprocessing import  Pipe,Process
 2 def foo(sk):
 3     sk.send('hello world')#通过管道sk发送内容
 4     print(sk.recv())#打印接收到的内容
 5 if __name__ == '__main__':
 6     sock,conn=Pipe()#定义一个管道的两头
 7     p=Process(target=foo,args=(sock,))#由于上面已经通过multiprocessing导入了Process,
 8     # 所以这里直接就可以创建一个子进程,并将sock(管道的一头)作为参数给foo函数
 9     p.start()#激活这个进程
10     print(conn.recv())#打印接收到的内容,conn是管道的另一头
11     conn.send('hi son')#通过管道发送内容

上面代码通过Pipe来实现两个进程间的通信。

 1 from multiprocessing import  Manager,Process
 2 def foo(l,i):#收到参数,l是Mlist,i是循环的i
 3     l.append(i*i)#将i平方添加到Mlist
 4 if __name__=='__main__':
 5     manager=Manager()
 6     Mlist=manager.list([11,22,33])#定义一个列表
 7 
 8     l=[]
 9     for i in range(5):#创建5个子进程
10         p=Process(target=foo,args=(Mlist,i))#定义一个进程,将Mlist和i作为参数传到foo
11         p.start()#激活这个进程,执行foo函数
12         l.append(p)#将5个进程添加到l这个列表
13     for i in l:
14         i.join()#循环这个列表,然后将每个进程join
15     print(Mlist)#当所有的子进程都结束,运行主进程

上面代码通过Manger实现子进程间的通信。

 

协程
协程,又叫微线程,实际上就是单线程,通过python语法,或模块来实现并发。
本质上就是一个进程一个线程。

上图是用yield实现了一个两个函数逇并发处理。

 1 from greenlet import greenlet#导入这个模块
 2 def foo():#定义一个函数
 3     print('ok1')#打印
 4     gr2.switch()#将程序切换到下面一个函数,按照名字切
 5     print('ok3')#打印
 6     gr2.switch()#将程序切换到下面一个函数,按照名字切
 7 def bar():
 8     print('ok2')#打印
 9     gr1.switch()#切到上面foo函数
10     print('ok4')
11 gr1=greenlet(foo)#实例化这个函数
12 gr2=greenlet(bar)
13 gr1.switch()#在外面写这个就执行了这个函数

通过greenlet模块的switch来实现协程的切换,greenlet模块需要手动去pycharm下载

 1 import gevent#导入这个模块
 2 def foo():
 3     print('running in foo')
 4     gevent.sleep(2)#打印之后睡一秒,模拟io操作
 5     print('switch to foo again')
 6 def bar():
 7     print('switch  to bar')
 8     gevent.sleep(1)#打印之后睡一秒,模拟io操作
 9     print('switch to bar again')
10 gevent.joinall([gevent.spawn(foo),gevent.spawn(bar)])
11 '''
12 这个程序的运行过程是,先执行foo函数,
13 打印之后遇到了IO操作,然后自动切换到下一个函数执行,
14 打印之后又遇到了IO操作,然后切回foo函数发现IO2秒还没有结束,
15 然后又切到了bar函数发现IO结束,打印,再切回foo函数打印
16 '''

上面代码通过gevent模块来实现写成的IO期间自动切换实现并发的程序。
gevent需要从pycharm下载。

 

转载于:https://www.cnblogs.com/ArmoredTitan/p/7212171.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

备份ad_IT管理公开课——备份恢复解决方案

时间:2020年5月28日 14:00内容:调查显示,44%的客户面临意外删除或修改数据,如果没有提前备份,这些数据是很难恢复的。RecoveryManager Plus是一款针对AD域,Exchange,Sharepoint以及O…

Ajax中的url使用规则

Ajax中的url使用规则Ajax中的url使用规则如下: 先封装项目访问地址: String basePath request.getScheme() "://" request.getServerName() ":" request.getServerPort() request.getContextPath();然后在js中定义&#xff1…

[网络管理]全双工与半双工的差别

[网络管理]全双工与半双工的差别 同事说新办公室的网络一直不稳定,常常掉线延迟。检查进口线路和更换转接网线。都无法解决这个问题。预计是不是进口网线中一根或者2根短路,那就改动下网卡属性吧。 把自适应改成全双工10M模式,測试OK。全双工…

echarts大屏模板_完整的可视化大屏分享,科技感十足,各行业直接就能用

你的老板有没有要求过你做一个可视化大屏?或许在你看来,这就是一个无理的需求,很简单啊,做几个动态图表,直接投影到屏幕上不就行了?就算做出来能用数据增长业务吗?不懂为什么要拍脑袋做大屏&…

sql查询字段的值不为空

sql查询字段的值不为空SQRJS IS NOT NULL AND SQRJS <![CDATA[ <> ]]>

Java面试基础知识(1)

1、final, finally, finalize的区别final&#xff1a;修饰符&#xff08;关键字&#xff09;如果一个类被声明为final&#xff0c;没有子类也不能被继承。因此一个类不能既被声明为 abstract的&#xff0c;又被声明为final的。将变量或方法声明为final&#xff0c;可以保证它们…

bird 报表_轻松完成Birt报告

bird 报表这是使用Birt插件在Eclipse中构建报告的完整指南。 Birt或Business Intelligence and Reporting工具是一种无需编写太多Java代码即可生成报告的工具。 如果您使用的是ireport&#xff0c;那么您知道我在说什么&#xff1a;&#xff09;&#xff08;晶体报告..毫无意义…

通过kubeadm安装kubernetes 1.7文档记录[docker容器方式]

参照了网上N多文档&#xff0c;不一一列表&#xff0c;共享精神永存&#xff01;&#xff01;&#xff01;&#xff01; 获取所有安装包 安装包分为两类&#xff0c;rpm安装包和docker镜像 rpm安装包 rpm为以下四个 kubeadm-1.7.0-0.x86_64.rpm kubectl-1.7.0-0.x86_64.rpm ku…

san框架计数的textarea

san框架计数的textarea<template><div style"height: 100%;width:100%;"><div style"border-bottom: 1px solid #e7e7e7"><div style"height:230px;overflow: hidden;"><t-textarea id"cxfssy" value"…

京东五星电器送扫地机器人_京东五星电器联手打造互联网小家电“孵化器”

出新迭代迅速、件均价较低的生活小家电复购率高&#xff0c;易“种草”&#xff0c;是最具活力的家电品类。11月24日&#xff0c;京东小家电事业部联合京东五星电器召开“小家电发展战略沟通会”&#xff0c;美的、苏泊尔、九阳、小熊、雀巢、德龙、戴森、飞利浦、科沃斯等众多…

异或运算性质

异或性质**异或运算的性质**

想办法解决window刷新的问题

看了一下还是webStorage或者cookie转载于:https://www.cnblogs.com/cndotabestdota/p/7232248.html

星痕 轻松实现大屏数据可视化_数据美的历程有多难?大屏可视化轻松帮你实现...

看到这个数据可视化大屏&#xff0c;我们如何实现美感呢&#xff1f;正确的姿势必不可少&#xff01;当我们满怀激动地开始数据可视化时&#xff0c;请不要马上钻入某个细节里&#xff0c;不要急着考虑用什么酷炫的图表来展现&#xff0c;也不要纠结于用什么颜色、什么字体。而…

网页局部打印

<div>文件头部,不打印出来的内容。。。</div> <div>文件头部,不打印出来的内容。。。</div> <div>文件头部,不打印出来的内容。。。</div> <!--startprint--> <div>这是被打印出来的内容</div> <div>这是被打印出…

WdatePicker获取不超过今天的值

WdatePicker获取不超过今天的值οnclick"WdatePicker({dateFmt:yyyy-MM-dd, maxDate: %y-%M-%d}})

卡方检验检验水准矫正_【2008.】趋势性卡方检验专题讨论

学员提问学员老师&#xff0c;在SPSS中怎样实现线性趋势卡方检验呢&#xff1f;很多学员都为这个问题疑惑&#xff0c;下面我来详细介绍一下。老师1、线性趋势卡方检验的常用方法&#xff1a;线性趋势检验最常用的方法是&#xff1a;Cochran-Armitage Test for Trend(也就是the…

java获取类名不包括路径

class.getSimpleName()&#xff0c;就能获得仅仅的类名 class.getName()获得的是全路径的类名转载于:https://www.cnblogs.com/panxuejun/p/7240559.html

关于java包_关于Java包

关于java包我希望大家都同意&#xff0c;类的方法应该很小&#xff0c;并且只有很少的依赖关系。 这种观点被广泛接受&#xff0c;而对“小”的解释则各不相同。 关于这一点有很多文献。 但是包裹呢&#xff1f; 有些人将包视为名称空间。 因此&#xff0c;包仅仅是允许您为类重…

前端布局的一些收获

前端布局的一些收获这段时间做前端样式的改造&#xff0c;有一些收获&#xff0c;来记录一下(吐槽一句IE垃圾) 1.calc()函数 定义与用法 calc() 函数用于动态计算长度值。 需要注意的是&#xff0c;运算符前后都需要保留一个空格&#xff0c;例如&#xff1a;width: calc(10…

lua菜鸟教程_Lua语言学习

根据百科描述&#xff1a;Lua是一个小巧的脚本语言&#xff0c;是巴西里约热内卢天主教大学里的一个研究小组&#xff0c;由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中&#xff0c;从而为应…