前言介绍

  协程 ,又称为微线程,它是实现多任务的另一种方式,只不过是比线程更小的执行单元。因为它自带CPU的上下文,这样只要在合适的时机,我们可以把一个协程切换到另一个协程。通俗的理解: 在一个线程中的某个函数中,我们可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的 ,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定。

  协程与线程的差异:
  在实现多任务时, 线程切换从系统层面远不止保存和恢复CPU上下文这么简单。操作系统为了程序运行的高效性,每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作,所以线程的切换非常耗性能。但是协程的切换只是单纯地操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住。

  下面举例说明协程和线程使用过程中CPU消耗情况

  1、创建线程测试文件 threads.py,代码内容如下:

import time
from threading import Thread def hello(x):
"""测试任务"""
for i in range(50):
print(f'测试线程{x}')
time.sleep(1) # 模拟 def thread_test():
"""创建1000个线程并进行任务"""
for i in range(1000):
Thread(target=hello, args=(i,)).start() if __name__ == '__main__':
thread_test()

  2、创建协程测试文件 gevents.py,代码内容如下:

import gevent

from gevent import monkey

monkey.patch_all()
import time def hello(x):
"""测试任务"""
for i in range(50):
print(f'测试协程{x}')
time.sleep(1) def gevent_test():
"""创建1000个协程任务"""
gevent.joinall([gevent.spawn(hello, i) for i in range(1000)]) if __name__ == '__main__':
gevent_test()

运行结果:

结论:开启1000个线程任务所消耗的CPU是13.5%,开启1000个协程任务消耗的CPU是 1.1%,协程远优于线程

众所周知 ,多线程除了会给cpu带来切换上下文的开销,还会产生资源竞争,想要用多线程,免不了加锁操作,协程完美的避免了这个问题。

所以在多线程和协程都能适用的场景下,协程是一个更好的选择。

最新文章

  1. 【hibernate】之标注枚举类型@Enumerated(转载)
  2. 一起学习redis源码
  3. 《C++ 并发编程》- 第1章 你好,C++的并发世界
  4. Nginx+uWSGI+Django+Python在Linux上的部署
  5. Android内存优化之——static使用篇
  6. poj 1204
  7. jQuery 2.0.3 源码分析Sizzle引擎解析原理
  8. CentOS安装配置JDK-7(.rpm)
  9. Mac下eclipse导入其他工程中文注释出现乱码解决方案
  10. cocos2dx 中文路径编译错误记录
  11. 关于mpu6050的几个很好的帖子
  12. iOS企业版使用第三方实现自动更新版本
  13. 一张图教你读懂AI简史
  14. TCP和UDP的对比
  15. viewDidLoad, viewWillDisappear, viewWillAppear等区别及各自的加载顺序
  16. JavaScript模拟自由落体
  17. 关于checkbox全选与全不选的实现与遇到的问题
  18. 151. Reverse Words in a String(java 注意细节处理)
  19. 面试题之O(n)内旋转字符串
  20. XML 高速入门总结

热门文章

  1. foobox,基于foobar2000汉化版的CUI配置整合版
  2. [模拟] Codeforces - 1191C - Tokitsukaze and Discard Items
  3. Hive视图如何创建、特点及应用场景
  4. 推荐 | 7个你最应该知道的机器学习相关github项目
  5. Mayor's posters POJ - 2528 线段树(离散化处理大数?)
  6. adb的基本安装和介绍(一)
  7. App压力稳定性测试之Monkey
  8. web样式css
  9. coding++:JS/jQuery获取兄弟姐妹等元素
  10. ElasticSearch 9200 9300 端口