文章摘要
文章探讨了并发编程中的两个概念:异步性(asynchrony)和并发性(concurrency)。作者指出,尽管人们常讨论“并发不是并行”,但异步性这一关键概念却常被忽视。异步性指的是任务可以在不同时间点执行,而不需要严格顺序,这在处理I/O操作时尤为重要。通过示例,作者展示了异步性如何在实际编程中发挥作用,并强调了理解这一概念对优化软件生态系统的重要性。
文章总结
文章主要内容总结
标题:异步性(Asynchrony)不是并发性(Concurrency)
核心观点:文章探讨了异步性(Asynchrony)、并发性(Concurrency)和并行性(Parallelism)之间的区别,并指出在编程中,人们常常混淆这些概念,导致软件生态系统的设计出现问题。
1. 异步性、并发性与并行性的定义
- 异步性:任务可以无序执行,但仍能保持正确性。
- 并发性:系统能够同时推进多个任务,无论是通过并行执行还是任务切换。
- 并行性:系统能够在物理层面同时执行多个任务。
2. 异步性与并发性的区别
文章通过两个例子说明了异步性和并发性的区别: - 文件保存示例:两个文件的保存顺序无关紧要,可以先保存一个文件,再保存另一个文件,或者交替保存。这种情况下,代码是异步的,但不一定需要并发。 - TCP服务器与客户端示例:服务器必须同时接受连接,而客户端必须同时尝试连接。这种情况下,任务必须并发执行,否则会导致阻塞。
3. 异步性与并发性的混淆带来的问题
由于对异步性和并发性的理解不足,导致以下问题:
- 库作者需要重复工作(如redis-py与asyncio-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的线程池和绿色线程实现。
图片:无
评论总结
主要观点总结:
对并发和异步的定义存在争议
- 评论者认为作者对并发的定义存在混淆,并引用了一篇论文来支持自己的观点。
- 引用:"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."
- 评论者认为作者对并发的定义存在混淆,并引用了一篇论文来支持自己的观点。
异步与并发的关系
- 一些评论者认为异步和并发是相互关联的,异步操作通常需要某种形式的并发来实现。
- 引用:"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."
- 一些评论者认为异步和并发是相互关联的,异步操作通常需要某种形式的并发来实现。
对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."
- 有评论者对Zig的异步I/O设计表示赞赏,认为这是一个巧妙的想法,但也指出其在库开发中可能带来的复杂性和潜在问题。
对术语的批评
- 评论者认为“异步”这个术语本身容易引起混淆,建议使用更明确的数学术语(如“交换性”)来描述操作顺序无关性。
- 引用:"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."
- 评论者认为“异步”这个术语本身容易引起混淆,建议使用更明确的数学术语(如“交换性”)来描述操作顺序无关性。
对实际应用中的并发问题的讨论
- 评论者指出,在实际应用中,并发操作可能会带来非幂等性等问题,需要使用互斥锁等机制来避免。
- 引用:"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设计受到了一些赞赏,但也引发了对其复杂性和潜在问题的担忧。此外,评论者普遍认为术语的选择应更加清晰,以避免混淆。