Synchronous/Asynchronous

Synchronous/Asynchronous

同步/异步关注任务运行之后需不需要处理。

同步:任务完成后再处理;

异步:任务完成后自动处理(通常是通过回调函数实现,或者进入一个完成队列等待下一步处理)。

和阻塞/非阻塞一起理解:拿日常生活中的烧水举例来说,人的行为动作相等于用户程序,烧水相当于内核提供的系统调用,那么:

  • 同步/异步关注的是水烧开之后需不需要我来处理
  • 阻塞/非阻塞关注的是在水烧开的这段时间是不是干了其他事
  • 同步阻塞:点火,开始烧水,水没有开坚决不干任何事(阻塞),水开之后关火(同步)
  • 同步非阻塞:点火,开始烧水,就去煮饭(非阻塞),但同时会关注水开否,水开之后关火(同步)
  • 异步阻塞:用电热水壶烧水,按下开关,等待水开,水没有开坚决不干任何事(阻塞),水开之后自动断电(异步)
  • 异步非阻塞:用电热水壶烧水,按下开关,之后随便干啥都行(非阻塞),水开之后自动断电(异步)

并行和并发:Concurrency/Parallel

Concurrency(Simultaneous) / Parallel

Python 异步编程

Linux 事件模型

epoll

当事件没准备好时,放到 epoll 里面,事件准备好了就去读写。当读写返回 EAGAIN 时,将它再次加入到 epoll 里面。这样,只要有事件准备好了就去处理它,只有当事件没准备好时,才在 epoll 里面等着。

Python 异步编程

使用 Python 3.4 起引入的 asyncio 标准库实现。

import asyncio
async def say(what, when):
    await asyncio.sleep(when)
    return what

asyncio 模块在单线程上启动一个事件循环(event loop),时刻监听新进入循环的事件,加以处理,并不断重复这个过程,直到异步任务结束。

synchronous_asynchronous_python_js_async_001.png

Reference

湘ICP备19014083号-1