1

我正在浏览 twitter finagle库,它是 scala 中的一个异步服务框架,我对一般的异步库有一些疑问。

据我了解,使用回调的同步库的优点是应用程序线程获得空闲,并且一旦通过网络完成请求,库就会调用回调。通常,应用程序线程可能没有与库线程的 1:1 映射。

  1. 库线程中的服务调用阻塞对吗?
  2. 如果是这种情况,那么我们只是在其他线程中进行阻塞调用。这使应用程序线程自由,但其他一些线程正在做同样的工作。我们不能仅仅增加应用程序线程的数量来获得这个优势吗?

我可能误解了异步库通常是如何在 Java/Scala 或 JVM 中实现的。谁能帮我理解这是如何工作的?

4

1 回答 1

2

异步方法是有用的抽象:您的 CPU 密集型线程将长时间运行的 IO 操作卸载到专用(可能属于库)线程。当 IO 完成后,其他一些线程将收到 IO 结果。

使用阻塞方法,您将错过正在执行阻塞 IO 调用的线程的 CPU 滴答声。添加更多线程以确保始终有空闲线程来执行某些 CPU 工作意味着浪费 OS/JVM 资源进行重新调度。

使用阻塞 IO 是因为它更易于编程(无需同步调用者和回调)。

实际上,IO 只是异步样式有用的一种可能用例。一般来说,只要你觉得手头的任务会受益于将其拆分为多个活动,这些活动可以同时运行并相互通信,这就是异步风格的情况。未连接到 IO 的示例:

  • GUI:GUI事件循环线程将用户输入传递给后台线程,并进行必要的处理;
  • 利用现代多核 CPU:如果您的任务可以拆分为多个子任务,您可以在单独的线程中运行这些子任务,利用所有可用的内核。自然,您需要收集子任务的结果,并且这里需要异步样式。
于 2014-10-09T18:43:12.887 回答