python里的协程
来源:互联网 发布:淘宝联华文具 编辑:程序博客网 时间:2024/05/18 20:47
Coroutine,翻译成”协程“,初始碰到的人马上就会跟上面两个概念联系起来。直接先说区别,Coroutine是编译器级的,Process和Thread是操作系统级的。Coroutine的实现,通常是对某个语言做相应的提议,然后通过后成编译器标准,然后编译器厂商来实现该机制。Process和Thread看起来也在语言层次,但是内生原理却是操作系统先有这个东西,然后通过一定的API暴露给用户使用,两者在这里有不同。Process和Thread是os通过调度算法,保存当前的上下文,然后从上次暂停的地方再次开始计算,重新开始的地方不可预期,每次CPU计算的指令数量和代码跑过的CPU时间是相关的,跑到os分配的cpu时间到达后就会被os强制挂起。Coroutine是编译器的魔术,通过插入相关的代码使得代码段能够实现分段式的执行,重新开始的地方是yield关键字指定的,一次一定会跑到一个yield对应的地方。
所谓协程就是在一个线程中切换子进程,相比多线程有如下好处:最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
协程是为了协作操作进行的语言设计,一个协程函数被调用时创建一个协程对象,然后调用者就可以使用协程的函数send()来调用这个函数。一个协程可以在另一个协程里使用关键字await来暂停它的执行,当协程被暂停时,它的状态是被保存起来的,当它被再次激活时会恢复这个状态再次运行。
例子:
#asyncio_coroutine.py python 3.6import asyncioasync def coroutine(): print('in coroutine')event_loop = asyncio.get_event_loop()try: print('starting coroutine') coro = coroutine() print('entering event loop') event_loop.run_until_complete(coro)finally: print('closing event loop') event_loop.close()输出结果如下:
starting coroutine
entering event loop
in coroutine
closing event loop
在这个例子里,导入asyncio库,然后获取事件循环,这里采用默认的事件循环,然后使用run_until_complete()方法来运行协程对象,当协程退出时再关闭事件对象。
Python游戏开发入门
你也能动手修改C编译器
纸牌游戏开发
http://edu.csdn.net/course/detail/5538
五子棋游戏开发
http://edu.csdn.net/course/detail/5487
RPG游戏从入门到精通
http://edu.csdn.net/course/detail/5246
WiX安装工具的使用
http://edu.csdn.net/course/detail/5207
俄罗斯方块游戏开发
http://edu.csdn.net/course/detail/5110
boost库入门基础
http://edu.csdn.net/course/detail/5029
Arduino入门基础
http://edu.csdn.net/course/detail/4931
Unity5.x游戏基础入门
http://edu.csdn.net/course/detail/4810
TensorFlow API攻略
http://edu.csdn.net/course/detail/4495
TensorFlow入门基本教程
http://edu.csdn.net/course/detail/4369
C++标准模板库从入门到精通
http://edu.csdn.net/course/detail/3324
跟老菜鸟学C++
http://edu.csdn.net/course/detail/2901
跟老菜鸟学python
http://edu.csdn.net/course/detail/2592
在VC2015里学会使用tinyxml库
http://edu.csdn.net/course/detail/2590
在Windows下SVN的版本管理与实战
http://edu.csdn.net/course/detail/2579
Visual Studio 2015开发C++程序的基本使用
http://edu.csdn.net/course/detail/2570
在VC2015里使用protobuf协议
http://edu.csdn.net/course/detail/2582
在VC2015里学会使用MySQL数据库
http://edu.csdn.net/course/detail/2672
- python里的协程
- Python里的多线程
- python里的self
- Python里的enumerate
- python里的参数
- python里的metaclass
- python里的进制数
- Python 里的函数
- Python里的String
- python 里的集合
- python里把协程变成任务
- Python里隐藏的“禅”
- python里的装饰器
- Python 里的多重继承
- python里的get_page函数
- Python 里的多重继承
- python里的splitlines详解
- python里的splitlines详解
- Java基础类库简介及lang包介绍
- 【算法】欧几里德、毕达哥拉斯、帕斯卡和蒙特去公园已知三点组成平行四边形,求第四点
- CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)
- java算法之快速排序
- Vue2 全局-Vue.extend构造器拓展
- python里的协程
- UVA
- 线索二叉树(复习)
- (欧) 第18章 计算机网络及分布式系统
- 网络流24题-14
- VUE开发扫雷
- selenium自动化测试
- 【C】C语言核心知识点总结(Reference Manual)
- 学习MongoDB 七: MongoDB索引(索引基本操作)(一)