Programming languages 同步与异步语言

Programming languages 同步与异步语言,programming-languages,asynchronous,synchronous,Programming Languages,Asynchronous,Synchronous,在过去的一年里,我一直在研究Java和flex。在编写flex的时候,我的大部分代码部分都遇到了麻烦,因为它是异步的。这让我想到了同步执行语言与异步执行语言的真正优势和劣势 与其他语言相比,它们在哪些方面更强?它们属于哪些方面?(撇开语义级别的讨论,即“同步/异步语言”) 建立在“语言”(无论它是什么)之上的“框架”应该能够处理这种情况(同步/异步程序流),以便有用(读:$wise) 异步习惯用法适用于各种规模 在大规模上,异步技术有助于构建可靠的系统,因为现实世界本质上是异步的。换句话说,一个

在过去的一年里,我一直在研究Java和flex。在编写flex的时候,我的大部分代码部分都遇到了麻烦,因为它是异步的。这让我想到了同步执行语言与异步执行语言的真正优势和劣势

与其他语言相比,它们在哪些方面更强?它们属于哪些方面?

(撇开语义级别的讨论,即“同步/异步语言”)

建立在“语言”(无论它是什么)之上的“框架”应该能够处理这种情况(同步/异步程序流),以便有用(读:$wise)

异步习惯用法适用于各种规模

在大规模上,异步技术有助于构建可靠的系统,因为现实世界本质上是异步的。换句话说,一个人需要用“异步思维”来应对现实生活中的情况,如失败、损失、延迟等

即使在较小的规模上(例如GUI应用程序),事件(如“鼠标点击”)也往往是“异步的”。当然,它们在某种程度上是“序列化”的(以便运行某些软件的应用程序可以处理),但这并不会改变事件(可能)发生的事实
“异步”与所讨论的程序流有关。

我认为这与语言无关,而是与框架有关

反例:


在用C语言编写“Classic Mac”(MacOS 9及以前版本)应用程序(如果有的话,这是一种“同步”语言)时,您没有抢占式多线程,因此所有可能阻塞的系统调用都有一个异步的对应程序,您可以用包括回调函数在内的参数填充数据块。然后您进行系统调用(将立即返回),您的回调将被异步调用(在所谓的“中断级别”)。回调会执行另一个异步系统调用,创建一个与主线程异步运行的长后台线程,这种情况并不少见。

我去年大部分时间都在使用Silverlight编写代码,这意味着我花了大量时间思考(并解决)您描述的相同问题

简言之,正如其他人所指出的,异步模型的真正优势在于它能够创建与现实世界良好互操作的健壮系统。如果每次web服务调用需要几秒钟才能返回时UI线程都停止,那么没有人能够实际使用Silverlight(或Flash)应用程序

最大的缺点是生成的代码很复杂,很难排除故障。像错误处理这样的事情是一个PITA,但我不得不处理的最烦人的事情是协调来自多个异步调用的响应。比如说,如果在调用B之前需要调用A的信息,在调用C之前需要调用B的信息(等等),那么生成的代码看起来非常不愉快,并且容易受到各种奇怪的副作用的影响。有一些技术可以让所有这些东西工作,甚至相当干净,但是如果你来自同步世界(就像我一样),这是一个重要的学习曲线。(在我看来,当回调更干净、更不容易受到我所说的那种奇怪的副作用的影响时,微软将事件作为处理WCF呼叫的方式也无济于事。)

(是的,其他人说它不是异步的语言,而是特定框架需要以异步方式构建代码的语言,这是正确的,但我明白你的意思。)

更新日期2014.09.23-

自从我写了上面的答案之后,我已经在各种异步框架上做了更多的工作(可能其他做过任何web编码的人也是如此),我想我应该添加一些额外的随机注释:

  • 如果您使用的是具有一流异步支持的C#或F#之类的语言,至少在您熟悉了奇怪的
    async
    /
    wait
    模式之后,这会变得简单得多。能够轻松地围绕异步调用进行循环,并用一个简单的
    try/catch
    来包装整个过程,如果你曾经不得不用老方法来完成的话,那将是一件了不起的事情

  • 如果您没有使用具有一流异步支持的语言,请开始使用该语言提供的任何
    承诺
    未来
    任务
    支持(例如JQuery的
    $.Deferred()
    ,或Angular的
    $q.Deferred())
    。与通常通过回调获得的结果相比,这些方法更加简洁,提供了更好的结构

  • 异步代码对于编写可伸缩的服务器端系统至关重要。使一个典型的web服务器具有良好的可伸缩性的最大问题之一是,它开始耗尽线程,至少,如果它专用一个线程来处理传入的请求,它会这样做。如果该线程暂停,因为它正在等待对finis的长时间运行的同步调用h、 它完全不可用于帮助其他任何事情。更好的方法是使web服务器代码异步,这样,当您等待DB调用返回时,该线程可以在DB运行和执行DB所做的任何操作时为六个其他请求提供服务。在这一点上,对于高度可扩展的系统,异步是唯一的游戏(只需询问任何节点爱好者。)


一种语言怎么可能是异步的?@NSD-他的意思是flex从不阻塞-所有可能在其他平台上阻塞的操作都是异步实现的。您对“同步执行语言”有定义吗?或者您只是解释flex的事件驱动性质(这在几乎所有其他GUI API(包括Java)中都可以找到)是“异步的”?@kdgregory-我不明白你为什么简单地用flex的事件驱动特性来改变flex的执行机制。我很难理解这一点