异步库的优点

时间:2014-10-09 18:39:39

标签: java scala asynchronous jvm finagle

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

据我了解,使用回调的同步库的优点是应用程序线程可以自由,并且只要通过网络完成请求,库就会调用回调。通常,应用程序线程可能没有与库线程的1:1映射。

  1. 库线程中的服务调用是阻塞吗?
  2. 如果是这种情况,那么我们只是在其他线程中进行阻塞调用。这使应用程序线程自由,但其他一些线程正在做同样的工作。我们难道不能仅仅增加应用程序线程的数量来获得这种优势吗?
  3. 我可能误解了异步库在Java / Scala或JVM中的实现方式。任何人都可以帮我理解这是如何工作的?

1 个答案:

答案 0 :(得分:2)

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

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

使用阻止IO是因为它编程起来更简单(不需要同步调用者和回调)。

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

  • GUI:GUI事件循环线程将用户输入传递给后台线程,并进行必要的处理;
  • 利用现代多核CPU:如果您的任务可以拆分为多个子任务,则可以使用所有可用内核在单独的线程中运行这些子任务。当然,您需要收集子任务的结果,并且您在这里需要异步风格。
相关问题