事件驱动编程与协程的
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 |
基本分类
-
顺序执行 这个不用多说,大家都懂的
-
并发执行 这个无非是多进程,或者多线程
-
异步执行 这个狭义上来说,它是单线程的,通过协程来调度 CPU 挂起需要等待的任务。 好比你在打游戏,还想吃饭,那就先暂停游戏,淘米下锅,插上电饭锅的电源之后就可以回去打你的游戏了,等你一关打完,饭也烧好了,你再放下游戏回来盛饭。你并没有同时干两件事,但是你完成了两件事。
事件驱动编程
事件驱动编程大概是软件行业最知名的编程模式之一,事件驱动编程的三要素有
- event source
- event handler
- 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 国际许可协议进行许可。