同步与异步语言

Ume*_*esh 7 asynchronous programming-languages synchronous

在过去的一年里,我一直致力于Java和flex.在编写flex时,我的大多数代码部分都是异步的.这让我想到了同步执行语言与异步执行语言的真正优缺点.

与其他地区相比,它们更强大的区域是什么?它们落在哪些区域?

Ken*_*ith 7

我去年大部分时间都在Silverlight中编写代码,这意味着我花了很多时间思考(并与之抗争)你所描述的相同问题.

简而言之,正如其他人所指出的,异步模型的真正优势在于它能够创建与现实世界良好互操作的强大系统.如果UI线程每次花费几秒钟才能返回Web服务调用时,任何人都无法真正使用Silverlight(或Flash)应用程序.

最大的缺点是结果代码复杂且难以排除故障.错误处理之类的东西是PITA,但我必须处理的最烦人的事情是协调来自多个异步调用的响应.例如,如果您在拨打电话B之前需要来自呼叫A的信息,并且在拨打电话C之前需要来自呼叫B的信息(等等),则生成的代码看起来非常不愉快,并且容易受到各种奇怪的副作用的影响. .有一些技术可以使所有这些东西都有效,甚至可以相当干净,但是如果你来自同步世界(就像我一样),这是一个重要的学习曲线.(在我认为回调时,微软推动事件作为处理WCF调用的方式并没有帮助,因为它更清晰,更不容易受到我所讨论的那种奇怪的副作用的影响.)

(是的,其他人都说正确的语言不是异步语言,因为特定的框架需要以异步方式构建代码 - 但我理解你的意思.)

更新2014.09.23 -

自从我写了上面的答案之后,我已经做了很多关于各种异步框架的工作(可能是其他所有人都做了网络编码),并且我想添加一些额外的随机笔记:

  • 如果您使用的是像C#或F#这样具有一流异步支持的语言,那么一旦您绕过怪异async/ await模式,很多事情就会变得更加容易.能够在异步调用中轻松循环,并用简单的方式包装整个事情,try/catch如果你不得不以旧的方式做到这一点,那将是惊人的.

  • 如果你不使用具有一流的异步支持的语言,开始使用任何promisefuturetask支持的语言不提供(例如,JQuery的$.Deferred(),或有棱角的$q.defer().这些都是有很多清洁和比你通常回调获得提供更好的结构.

  • 异步代码对于编写可伸缩的服务器端系统至关重要.使典型的Web服务器扩展得很好的一个最大问题是它开始耗尽线程,至少,如果它专门用一个线程来达到传入的请求就会这样做.如果该线程停止,因为它正在等待长时间运行的同步调用完成,它完全无法帮助解决其他问题.更好的方法是使您的Web服务器代码异步,这样当您等待数据库调用返回时,该线程可以在数据库运行时执行其他六个请求并执行任何数据库操作.此时,对于高度可扩展的系统,异步是城里唯一的游戏.(只要询问任何节点爱好者.)