当多线程创建完毕之后,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

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

  1. Python之路,Day9 - 线程、进程、协程和IO多路复用

    参考博客: 线程.进程.协程: http://www.cnblogs.com/wupeiqi/articles/5040827.html http://www.cnblogs.com/alex3714 ...

  2. python3多进程 进程池 协程并发

    一.进程 我们电脑的应用程序,都是进程,进程是资源分配的单位.进程切换需要的资源最大,效率低. 进程之间相互独立 cpu密集的时候适合用多进程 #多进程并发 import multiprocessin ...

  3. Python菜鸟起飞day11_ 线程、进程、协程(一、多线程)

    目录 一.概述 1.1.什么是进程(Processes)? 1.2.什么是线程(Threads)? 1.3.什么是协程(Coroutines)? 1.3.1.疑问 二.多线程 2.1.Threadin ...

  4. javaweb学习总结(三十九)——数据库连接池

    javaweb学习总结(三十九)--数据库连接池 一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10 ...

  5. Python学习笔记三之编程练习:循环、迭代器与函数

    Python学习笔记三之编程练习 1. 编程第一步 # 求解斐波纳契数列 #/user/bin/python3#Fibonacci series:斐波那契数列 #两个元素的总和确定了下一个数 a,b= ...

  6. SurfaceFlinger学习笔记(三)之SurfaceFlinger进程

    概述 本系列是基于android Q 即android10 SurfaceFlinger学习笔记(一)应用启动流程 SurfaceFlinger学习笔记(二)之Surface SurfaceFling ...

  7. Python学习第三课-基本数据类型

    Python学习第三课-基本数据类型 一.基本概念 1.1表达式 1.2语句 1.3程序 1.4函数 内置函数 自定义函数 参数 返回值 二.标识符 2.1 关键字 2.2标识符概念 驼峰命名法 下划 ...

  8. python学习(三)scrapy爬虫框架(二)——创建一个scrapy爬虫

    在创建新的scrapy爬虫之前,我们需要先了解一下创建一个scrapy爬虫的基本步骤 第一步:确定要爬取的数据 以爬取豆瓣电影数据为例: 每部电影所要爬取的信息有: 片名:<头号玩家> 导 ...

  9. 孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(三十九)——数据库连接池 一、应用程序直接获取数据库连接的缺点   用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要

    孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(三十九)--数据库连接池 一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对 ...

最新文章

  1. 内联式css样式,直接写在现有的HTML标签中
  2. 首个获得FDA批准的脑机接口设备:“突破性”脑机接口设备用于造福人类
  3. php的mpdf开发实例,mpdf自动分页加页码的方法
  4. python文件处理:每隔一定数目删除;文件重命名;删除多余xml文件;将文件夹线所有文件平均分配到其他文件夹
  5. 打开ADS提示23111@localhost后提示无法与执照伺服机连线,怎么解决?
  6. mysql删除不存在行数据报错_MySQL学习笔记11复制错误处理(二)删除不存在的行的问题...
  7. 关于 SAP Spartacus SSR 服务器返回的响应是否应该被缓存的问题
  8. 终于等到DUDU把MetaBlog Api打开了
  9. Qt:Qt实现飞秋拦截助手—介绍
  10. Navicat premiu的导入和导出
  11. 安卓应用安全指南 5.6.1 密码学 示例代码
  12. 又出问题 三星Galaxy S10被曝意外触摸保护功能无效
  13. python os模块进程管理
  14. matlab船舶静水力曲线,静水力曲线图
  15. 机器学习(周志华)知识点总结——第3章 线性模型(后期上传word/PDF)
  16. 【知识点总结】电机学——题目部分
  17. 微信小程序商城毕业设计毕设作品(4)开题报告
  18. CSDN/博客园复制代码空格报错问题解决
  19. 微信wifi服务器地址,从零开始改造路由器实现微信连WIFI的功能(七):更简单的认证服务器wifidog-server...
  20. ECSHOP全部品牌页实现分页换页功能方法

热门文章

  1. php domdocument getelementbyid,PHP DOMDocument- getElementByID添加Â代替空
  2. 指针常量与常量指针精解【一次掌握】
  3. iview select选中值取值_iView的Select选择框
  4. nacos 本地测试_Nacos集群配置实例(windows下测试)
  5. 【渝粤教育】国家开放大学2018年秋季 0267-21T摄影技术 参考试题
  6. 【渝粤教育】21秋期末考试工程项目管理10324k2
  7. 【渝粤教育】 国家开放大学2020年春季 2710蔬菜栽培技术 参考试题
  8. [渝粤教育] 西南科技大学 机械控制工程基础在线考试复习资料
  9. 【渝粤教育】电大中专电子商务网站建设与维护 (7)作业 题库
  10. 【渝粤题库】陕西师范大学700011 新课程改革与生物教材研究