专栏首页readmecoroutine 协程
原创

coroutine 协程

Coroutines are computer-program components that generalize subroutines for non-preemptive multitasking, by allowing multiple entry points for suspending and resuming execution at certain locations. Coroutines are well-suited for implementing familiar program components such as cooperative tasks, exceptions, event loops, iterators, infinite lists and pipes. The async def type of coroutine was added in Python 3.5, and is recommended if there is no need to support older Python versions.

由于GIL的存在,导致Python多线程性能甚至比单线程更糟。

GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。[1]即便在多核心处理器上,使用 GIL 的解释器也只允许同一时间执行一个线程。

于是出现了协程(Coroutine)这么个东西。

协程/微线程/纤程/Coroutine作用是在执行函数A时,可以随时中断,去执行函数B,然后中断继续执行函数A(可以自由切换)。但这一过程并不是函数调用(没有调用语句),这一整个过程看似像多线程,然而协程只有一个线程执行。

import asyncio

async def compute(x, y):
    print("Compute %s + %s ..." % (x, y))
    await asyncio.sleep(1.0)
    return x + y

async def print_sum(x, y):
    result = await compute(x, y)
    print("%s + %s = %s" % (x, y, result))

loop = asyncio.get_event_loop()
loop.run_until_complete(print_sum(1, 2))
loop.close()
Compute 1 + 2 ...
1 + 2 = 3
[Finished in 1.2s]

import asyncio

async def factorial(name, number):
    f = 1
    for i in range(2, number+1):
        print("Task %s: Compute factorial(%s)..." % (name, i))
        await asyncio.sleep(1)
        f *= i
    print("Task %s: factorial(%s) = %s" % (name, number, f))

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(
    factorial("A", 2),
    factorial("B", 3),
    factorial("C", 4),
))
loop.close()
Task B: Compute factorial(2)...
Task A: Compute factorial(2)...
Task C: Compute factorial(2)...
Task B: Compute factorial(3)...
Task A: factorial(2) = 2
Task C: Compute factorial(3)...
Task B: factorial(3) = 6
Task C: Compute factorial(4)...
Task C: factorial(4) = 24
[Finished in 3.2s]

https://docs.python.org/zh-cn/3/library/asyncio-task.html

https://juejin.im/post/5c13245ee51d455fa5451f33

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Django Dev. 后台开发总结

    readme
  • sublime homebrew configuration

    readme
  • Socket 套接字协议

    A network socket is an internal endpoint for sending or receiving data within a ...

    readme
  • Task2 PNG_TO_TEXT

    它们分别是4个场景里的东西,garden, farm, dinning room 和 park。

    平凡的学生族
  • 请简述一下线程的sleep()方法和yield()方法有什么区别?

    (2)线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;

    剑走天涯
  • ARKit 进阶:物理世界

    ARKit的渲染能力是由其他框架实现的,除了苹果的SceneKit, Unity3D、UE, 或者其他自定义的OpenGL、Metal渲染引擎都可以与ARKit...

    郭艺帆
  • Django中间件之二

    Django是围绕“可重用应用”的思想建立的。Django具有一个丰富多样的由各种可以重用的应用组建起来的生态系统。PyPI上就已经列出了超过8000个Djan...

    菲宇
  • django组件-中间件

    中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需...

    超蛋lhy
  • 三十天学不会TCP,UDP/IP网络编程 - RST的用法

    不知不觉也写了这么多了,继续我的自己的推广大业~完整版可以去gitbook(https://www.gitbook.com/@rogerzhu/)看到。 如果对...

    一心一怿
  • String、StringBuffer、StringBuilder有什么区别?

    String 是 Java 语言非常基础和重要的类, 提供了构造和管理字符串的各种基本逻辑。它是典型的 Immutable 类,被声明成为 final cla...

    葆宁

扫码关注云+社区

领取腾讯云代金券