我正在浏览twitter finagle库,它是scala中的异步服务框架,我对一般的异步库有一些疑问。
据我了解,使用回调的同步库的优点是应用程序线程可以自由,并且只要通过网络完成请求,库就会调用回调。通常,应用程序线程可能没有与库线程的1:1映射。
我可能误解了异步库在Java / Scala或JVM中的实现方式。任何人都可以帮我理解这是如何工作的?
答案 0 :(得分:2)
异步方法是有用的抽象:CPU密集型线程将长时间运行的IO操作卸载到专用(可能属于库)线程。完成IO后,其他一些线程将收到IO结果。
使用阻止方法,您将错过正在执行阻塞IO调用的线程的CPU滴答。并添加更多线程以确保始终有自由线程来执行某些CPU工作意味着浪费OS / JVM资源进行重新调度。
使用阻止IO是因为它编程起来更简单(不需要同步调用者和回调)。
实际上,IO只是一种可能的用例,其中异步样式很有用。通常,只要您觉得手头的任务将从将其拆分为多个活动中受益,这些活动可以同时运行并且可以相互通信,这就是异步风格的情况。未连接到IO的示例: