使用异步编程模型(更具体地说,使用回调函数而不是阻止线程)的主要目的之一是最小化系统中阻塞线程的数量。
对于运行的线程来说,这个目标很明显,因为上下文切换和同步成本都会增加。
但是阻塞的线程呢?为什么减少它们的数量如此重要?
例如,在等待来自 web 服务器的响应时,线程被阻塞并且不占用任何 CPU 时间,也不参与任何上下文切换。
所以我的问题是:
除了 RAM(约1MB每个线程?)以外,阻塞线程还会占用哪些资源?
还有一个更主观的问题:
在什么情况下,这种代价真的能够证明写异步代码的麻烦是值得的(代价可能包括将你漂亮简洁的方法拆分成许多 beginXXX 和 EndXXX 方法,并将参数和局部变量移动到类字段中)。
更新-我没有提到或没有给予足够重视的其他原因:
1. 更多的线程意味着需要在公共资源上进行更多的锁定。 2. 更多的线程意味着更多线程的创建和销毁,这是昂贵的。 3. 系统肯定会耗尽线程/RAM,然后停止服务客户端(在 web 服务器场景下,这实际上可能会导致服务崩溃)。
对于运行的线程来说,这个目标很明显,因为上下文切换和同步成本都会增加。
但是阻塞的线程呢?为什么减少它们的数量如此重要?
例如,在等待来自 web 服务器的响应时,线程被阻塞并且不占用任何 CPU 时间,也不参与任何上下文切换。
所以我的问题是:
除了 RAM(约1MB每个线程?)以外,阻塞线程还会占用哪些资源?
还有一个更主观的问题:
在什么情况下,这种代价真的能够证明写异步代码的麻烦是值得的(代价可能包括将你漂亮简洁的方法拆分成许多 beginXXX 和 EndXXX 方法,并将参数和局部变量移动到类字段中)。
更新-我没有提到或没有给予足够重视的其他原因:
1. 更多的线程意味着需要在公共资源上进行更多的锁定。 2. 更多的线程意味着更多线程的创建和销毁,这是昂贵的。 3. 系统肯定会耗尽线程/RAM,然后停止服务客户端(在 web 服务器场景下,这实际上可能会导致服务崩溃)。