Hacker News 中文摘要

RSS订阅

异步并非并发 -- Asynchrony is not concurrency

文章摘要

文章探讨了并发编程中的两个概念:异步性(asynchrony)和并发性(concurrency)。作者指出,尽管人们常讨论“并发不是并行”,但异步性这一关键概念却常被忽视。异步性指的是任务可以在不同时间点执行,而不需要严格顺序,这在处理I/O操作时尤为重要。通过示例,作者展示了异步性如何在实际编程中发挥作用,并强调了理解这一概念对优化软件生态系统的重要性。

文章总结

文章主要内容总结

标题:异步性(Asynchrony)不是并发性(Concurrency)

核心观点:文章探讨了异步性(Asynchrony)、并发性(Concurrency)和并行性(Parallelism)之间的区别,并指出在编程中,人们常常混淆这些概念,导致软件生态系统的设计出现问题。

1. 异步性、并发性与并行性的定义

  • 异步性:任务可以无序执行,但仍能保持正确性。
  • 并发性:系统能够同时推进多个任务,无论是通过并行执行还是任务切换。
  • 并行性:系统能够在物理层面同时执行多个任务。

2. 异步性与并发性的区别

文章通过两个例子说明了异步性和并发性的区别: - 文件保存示例:两个文件的保存顺序无关紧要,可以先保存一个文件,再保存另一个文件,或者交替保存。这种情况下,代码是异步的,但不一定需要并发。 - TCP服务器与客户端示例:服务器必须同时接受连接,而客户端必须同时尝试连接。这种情况下,任务必须并发执行,否则会导致阻塞。

3. 异步性与并发性的混淆带来的问题

由于对异步性和并发性的理解不足,导致以下问题: - 库作者需要重复工作(如redis-pyasyncio-redis)。 - 异步代码的传播性导致用户不得不放弃编写同步代码的能力。 - 为了解决这些问题,引入了不合理的“逃生舱口”,导致性能不佳或死锁。

4. Zig语言中的异步性与并发性

在Zig语言中,异步性并不等同于并发性。使用io.async并不一定意味着并发执行,代码可以在单线程阻塞模式下运行。这意味着库作者可以使用io.async而不强制用户放弃单线程阻塞I/O。

5. 任务切换与事件循环

文章详细解释了任务切换(如yield)的工作原理,特别是在绿色线程(green threads)中的实现。任务切换允许程序在等待I/O操作完成时切换到其他任务,从而实现并发。

6. Zig中的并发性要求

在某些情况下,并发性是必须的。Zig通过io.asyncConcurrent来保证任务的并发执行,并在代码中明确并发性的要求。

7. 结论

文章希望读者能够理解异步性和并发性的区别,并相信我们可以摆脱当前异步/等待(async/await)模式的局限性,避免代码重复,实现异步和同步代码的无缝共存。

最后,作者预告了Zig异步I/O的重新设计,并邀请读者观看他在Twitch上的直播,进一步探讨Zig的线程池和绿色线程实现。

图片:无

评论总结

主要观点总结:

  1. 对并发和异步的定义存在争议

    • 评论者认为作者对并发的定义存在混淆,并引用了一篇论文来支持自己的观点。
      • 引用:"IMO the author is mixed up on his definitions for concurrency."
      • 引用:"https://lamport.azurewebsites.net/pubs/time-clocks.pdf"
    • 另一位评论者认为并发和并行的区分在现实中并不实用,尤其是在实际系统中,这种区分往往无法准确描述系统的行为。
      • 引用:"The argument about concurrency != parallelism mentioned in this article as being 'not useful' is often quoted and rarely a useful or informative."
      • 引用:"parallelism vs concurrency gives literally no insights or information here because it's a pointless distinction in practice."
  2. 异步与并发的关系

    • 一些评论者认为异步和并发是相互关联的,异步操作通常需要某种形式的并发来实现。
      • 引用:"Async must be concurrent, otherwise it stops being async. It becomes synchronous."
      • 引用:"The abstraction allows for, but does not require, a concurrent implementation. However, the intent behind the abstraction is that there be concurrency."
  3. 对Zig语言异步I/O的看法

    • 有评论者对Zig的异步I/O设计表示赞赏,认为这是一个巧妙的想法,但也指出其在库开发中可能带来的复杂性和潜在问题。
      • 引用:"The new Zig I/O idea seems like a pretty ingenious idea, if you write mostly applications and don't need stackless coroutines."
      • 引用:"Writing concurrent/async/parallel/whatever code is difficult enough on its own even if you have perfect knowledge of the I/O stack that you're using."
  4. 对术语的批评

    • 评论者认为“异步”这个术语本身容易引起混淆,建议使用更明确的数学术语(如“交换性”)来描述操作顺序无关性。
      • 引用:"Asynchrony is a very bad word for this and we already have a very well-defined mathematical one: commutativity."
      • 引用:"asyncConcurrent(...) is confusing as shit, and unless you memorize this blog post, you'll have no idea what this code means."
  5. 对实际应用中的并发问题的讨论

    • 评论者指出,在实际应用中,并发操作可能会带来非幂等性等问题,需要使用互斥锁等机制来避免。
      • 引用:"All the pitfalls of concurrency are there - in particular when executing non-idempotent functions multiple times before previous executions finish, then you need mutexes!"

总结:

评论中对并发、并行和异步的定义及其关系存在较大争议,部分评论者认为这些术语的区分在实际应用中并不实用。同时,Zig语言的异步I/O设计受到了一些赞赏,但也引发了对其复杂性和潜在问题的担忧。此外,评论者普遍认为术语的选择应更加清晰,以避免混淆。