一文看懂Python中的协程

1. 什么是协程

在 Python 和 Lua 语言中,都有协程这个概念,那么什么是协程呢?

协程是单线程下的并发,又称微线程,纤程。英文名Coroutine。

一句话总结:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。

也就是说它和程序员有关系,相对线程和进程来说,调度是由CPU来决定调度的。

2. 协程出现的原因

Python 由于众所周知的 GIL 的原因,导致其线程无法发挥多核的并行计算能力。

在GIL之下,同一时刻只能有一个线程在运行,在多任务并发(非并行)的情况下,每个任务在合适的时候挂起(发起I/O)和恢复(I/O结束),这样可以极大的提高CPU的效率。

相对而言,如果是cpu密集型,推荐多进程的方式。

在早期的 Python 实现中,是通过 yieldsend 来分别实现切换,及返回结果。

举例来说:

import random
import time

def stupid_fib(n):
    index = 0 
    a = 0 
    b = 1 
    while index < n:
        sleep_cnt = yield b
        print('query https://www.xtuz.net {0} secs'.format(sleep_cnt))
        time.sleep(sleep_cnt)
        a, b = b, a + b 
        index += 1
print('-'*10 + 'test yield send' + '-'*10)
N = 20
sfib = stupid_fib(N)
fib_res = next(sfib)
while True:
    print(fib_res)
    try:
        ss = random.uniform(0, 0.5)
        print('ss=%s' %ss)
        fib_res = sfib.send(ss)
    except StopIteration:
        break

yield - 用来从子程序中断,并返回结果

send - 用来从主程序向子程序发送信息

2. 协程的优缺点

协程优点主要有以下两点:

  1. 协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级
  2. 单线程内就可以实现并发的效果,最大限度地利用 CPU

协程缺点主要也有以下两点

  1. 协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程
  2. 协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程

4. 协程的使用场景

协程基于generator,Python3 中内置了异步IO。遇到IO密集型的业务时,总是很费时间啦,多线程加上协程, 在磁盘在读写的同时,还能去做其他的事情,在WEB应用中效果尤为明显。


相关主题:
相关推荐
  1. 李佐学校幼儿园 - 保定幼儿园黄页
  2. 车队管理及解决方案 - 附SkyBitz & Omnitracs成立车队管理合作伙伴
  3. Python实战 - Django自动化创建sitemap
  4. 小老鼠一家过年
  5. 长沙市望城县雨敞坪镇瓦灰小学
  6. Python公开课 - Django配置多源数据库
  7. 巨鹿大战
  8. 奥迪客户不满加价,被武汉4S店销售群殴
  9. 瓜田不纳履李下不整冠
  10. 替景公占梦
  11. 江门市江海区n赝沸⊙
  12. 沧州市河间市馨馨幼儿园 - 沧州幼儿园黄页
  13. 上海市青浦区东方宝贝双语幼儿看护园 - 上海幼儿园黄页
  14. 长沙市浏阳市金刚镇云岩完全小学
  15. 沈阳市铁西区英才乐艺术幼儿园 - 沈阳幼儿园黄页
  16. 沧州市河间市智慧树幼儿园 - 沧州幼儿园黄页
  17. 谁来的电话
  18. 警方通报:武汉男子持刀至五死一伤,嫌犯已跳桥
  19. 百名网媒总编辑登上知音号欣赏武汉夜色
  20. 浮萍与水草
  21. 海南省三亚市启明星幼儿园 - 海南省幼儿园黄页
  22.  巫师换心记
  23. 芝罘区芝罘岛小学
  24. 上海康桥镇第二小学
  25. 沈阳市铁西区齐贤街第二小学(齐贤二校)
  26. 天津市和平区西康路小学
  27. 央媒聚焦!国庆假期173.78万人次打卡大美黄陂
  28. 【干货】如何高效编写软件系统设计文档 - 含模板下载
  29. Python公开课 - 爬虫识别滑动验证码
  30. 破天荒
  31. 济南市长清区乐天小学
  32. 风 后 岭
  33. 没有触角的小蚂蚁
  34. Python公开课 - PDB调试处理
  35. Python公开课 - 页面解析之Beautiful Soup
  36. 小状元幼儿园 - 哈尔滨幼儿园黄页
  37. 武安市矿山镇史石门小学
  38. Python公开课 - Appium安装
  39. 武汉动物园火烈鸟孔雀排队打疫苗
  40. 事发武汉农夫山泉矿泉水内惊现大量虫卵
  41. 武汉推出越王勾践剑交通卡
  42. 湖北将发放消费券 - 武汉新鲜事
  43. Amazon Rekognition 新技术与个人隐私的冲突
  44. 哈尔滨工业大学二校区幼儿园 - 哈尔滨幼儿园黄页
  45. 武汉女子网上做兼职被骗六十五万
  46. 武汉一女子七天被骗220万
  47. Python基础 - 详解django.utils.dateparse
  48. 大连市西岗区甜甜幼儿园 - 大连幼儿园黄页
  49. 深圳市坪山新区坪山第二小学(坪山二小)
  50. 天使育幼 - 石家庄幼儿园黄页