我已经做了很多的发展在C#/。Net和异步的故事一直存在,从每天一(诚然API的已超过从开始/结束事件的年显著改变,以Task<T>
用async
/ await
)。在过去大约一年的时间里,我一直在使用Node.js进行开发,该工具异步执行所有I / O,并使用单线程事件循环模型。最近,我在一个正在使用Ruby的项目上工作,对于应用程序的一部分,我感到异步发出一大堆Web请求是很有意义的,并且感到惊讶的是,发现Ruby中的异步故事非常广泛不同。执行任何异步I / O的唯一方法是使用EventMachine
。
我的问题归结为:为什么在.Net中(而且据我所知Java和JVM也是如此)不需要事件循环,并且我可以随时触发异步请求,但是在像Ruby / Python这样的语言中,我需要分别使用eventmachine / twisted吗?我感觉异步I / O的工作原理有些根本不了解的事情。
我的问题归结为:为什么在.Net中(而且据我所知Java和JVM也是如此)不需要事件循环,并且我可以随时触发异步请求,但是在像Ruby / Python这样的语言中,我需要分别使用eventmachine / twisted吗?
我认为这是因为Ruby / Python(以及无缝的Node.js)希望通过为应用程序的核心循环强加单线程模型来简化开发人员的生活。使用事件机,异步I / O例程的完成回调将被序列化并排队在同一线程上执行,因此开发人员不必担心线程安全。
我不能说Java,但是在.NET中,我们可以通过同步上下文对此进行控制。检查Stephen Cleary的“全部与SynchronizationContext有关”。在.NET中复制事件机器的概念非常容易(实际上,这对于UI应用程序是自动完成的)。序列化同步上下文的自定义实现可能类似于AsyncPump
Stephen Toub的“ Await,SynchronizationContext和Console Apps”。IMO,这将是Ruby事件机器的直接匹配。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句