异步不是并发

主要观点:

  • 强调“并发(Concurrency)”与“并行(Parallelism)”的区别,提出“异步(Asynchrony)”这一缺失术语,解释其与并发、并行的关系。
  • 通过两个代码示例(保存两个文件、创建 TCP 服务器并连接)说明异步、并发的概念及应用场景,在文件保存示例中可先完成一个文件的保存再开始第二个,而在服务器客户端连接示例中两个任务的执行必须重叠。
  • 指出因对异步和并发差异认识不足导致语言生态系统和用户体验的问题,如库作者重复工作、用户难以编写普通同步代码等。
  • 以 Zig 语言为例,说明异步在 Zig 中不是并发,io.async的使用不意味着并发,代码可在单线程阻塞模式下运行,而同步代码可通过使用事件 I/O 系统调用和任务切换原语利用并发,且正常同步代码和异步代码可在同一程序中并发运行。
  • 以客户端 - 服务器示例说明在某些情况下需要显式使用io.asyncConcurrent来保证并发以确保正确性,同时指出代码中省略了错误处理等细节。

关键信息:

  • 异步:任务可乱序运行仍正确。
  • 并发:系统同时推进多个任务,可通过并行或任务切换。
  • 并行:系统在物理层面同时执行多个任务。
  • Zig 中io.async可在单线程阻塞模式下运行,同步代码可通过特定方式利用并发,异步代码可与同步代码并发运行。

重要细节:

  • 在文件保存示例中,先完成一个文件保存再开始第二个文件保存是合法的;在服务器客户端连接示例中,服务器需在客户端连接时保持活跃,两个任务执行必须重叠。
  • Zig 中通过yield实现任务切换,如绿色线程通过栈交换实现,同步代码可通过事件 I/O 系统调用和任务切换原语利用并发。
  • 在 Zig 中,io.asyncConcurrent保证并发,是可失败函数,io.async在某些情况下直接运行函数。
  • 7 月 21 日 19 点 CEST 将在 Twitch 上直播 Zig 异步 I/O 重新设计相关内容。
阅读 24
0 条评论