事件驱动编程与协程的

Posted on Tue 10 May 2022 in Journal

Abstract Journal on 2015-02-28
Authors Walter Fan
 Category    learning note  
Status v1.0
Updated 2015-02-28
License CC-BY-NC-ND 4.0

基本分类

  1. 顺序执行 这个不用多说,大家都懂的

  2. 并发执行 这个无非是多进程,或者多线程

  3. 异步执行 这个狭义上来说,它是单线程的,通过协程来调度 CPU 挂起需要等待的任务。 好比你在打游戏,还想吃饭,那就先暂停游戏,淘米下锅,插上电饭锅的电源之后就可以回去打你的游戏了,等你一关打完,饭也烧好了,你再放下游戏回来盛饭。你并没有同时干两件事,但是你完成了两件事。

事件驱动编程

事件驱动编程大概是软件行业最知名的编程模式之一,事件驱动编程的三要素有

  1. event source
  2. event handler
  3. event loop

asyncio

基本概念

asyncio 是 python 在 3.4 中引入的一个协程管理模块

  • 事件循环 event loop

asyncio 模块允许每个进程有一个事件循环,用来注册任务和切换执行任务的控制流

  • coroutine 协程

也称为纤程,比线程更小的执行单位,可以暂时挂起,再回到暂停的地方继续执行。 协程有多个入口点,可以多次交出控制,让 CPU 切换到其他的协程。

  • Future 未来

它表示一个还不可用的结果,会在未来的某一时刻顺利完成,或者发生异常。

  • Task 任务

用来封装协程

实例

import asyncio

async def factorial(name, number):
    f = 1
    for i in range(2, number + 1):
        print("Task {} compute factorial({})...".format(name, i))
        await asyncio.sleep(1)
        f *= i
    print("Task {} compute factorial({}) = {}".format(name, number, f))


loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(
    factorial("A", 2),
    factorial("B", 3),
    factorial("C", 4),
))

执行结果如下

# python3 asyncio_multi_jobs.py
Task A compute factorial(2)...
Task B compute factorial(2)...
Task C compute factorial(2)...
Task A compute factorial(2) = 2
Task B compute factorial(3)...
Task C compute factorial(3)...
Task B compute factorial(3) = 6
Task C compute factorial(4)...
Task C compute factorial(4) = 24


本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。