同步与异步编程:它们有何不同?

您会同意,尤其是如果您还是编程新手,那么某些编码术语会令人生畏。

对于某些开发人员而言,诸如“异步”和“同步编程”之类的术语属于令人困惑但经常使用的编码术语。那么这些术语是什么意思呢?它们有何不同?以及它们如何工作?我们将回答所有这些问题,甚至更多。

同步编程如何工作

同步的Web应用程序将按单个顺序加载资源,这样,当层次结构中的较高资源或组件无法加载时,位于其下方的资源或组件将不会响应。

您要求使用多线程协议进行同步操作。

注意:线程是一个单一的端到端工作程序或通道,用于处理编程中的请求。

这些线程中的每个线程在同步编程中分别处理请求。因此,每个线程都有其执行时间,并在执行下一个事件之前完全加载。因此,在线程中执行事件会锁定其他线程,从而阻塞进程中的整个用户界面。

通常,仅在同步编程上运行的Web应用程序会锁定地依赖加载资源。始终,每个操作(包括POST和GET请求)都需要为每个请求和响应重新加载。

因此,同步调用可确保客户端或浏览器在执行下一个请求之前从第一个请求获得响应。这可能会导致不必要的延迟和较差的用户体验。

相关:如何用Java编写多线程代码

例如,当尝试在同步运行的网站上提交表单时,在填写必要的字段并提交表单之后,客户端(浏览器)会锁定整个表单字段。

因此,它可以防止您在提交期间对表单字段进行进一步的更新或单击Web应用程序的任何其他部分。

相关:如何在Windows上安装Node.js和npm

这是一些同步代码的示例,这些代码使用node.js中的fs模块读取文件的内容:

 var fs = require('fs');
const readData = fs.readFileSync('text.txt');
console.log(readData.toString());
setTimeout(()=>{
console.log('Hello world, I block other threads...')
}, 1000
);

上面的代码使用readFileSync方法获取文本文件的内容,但不使用回调函数。

异步编程如何工作

在异步编程中,应用程序使用非阻塞输入和输出(I / O)协议来服务请求和响应。与同步编程不同,异步程序不会分层执行操作。因此,程序在等待另一个请求响应之前不会等待请求的执行。

本质上,即使它们处于不同的功能中,它也可以同时执行请求。结果,使用异步编程开发的应用程序仅将其全部内容加载一次。

一个线程在一个事件循环中处理多个请求。因此,一个请求的失败不会影响另一个请求。

由于异步加载是非阻塞的,因此按此原理运行的Web应用程序最终可能是单页应用程序。

例如,与同步编程不同,在填写和提交表单之后,函数将通过异步方式发送它,而不会锁定其他字段或整个用户界面。因此,您可以在提交过程中更新其他表单字段,并在Web应用程序上发出更多请求。

因此,您不必等待请求,因为它们都在单个循环中运行。因此,与同步应用程序不同,异步应用程序可提供更好的用户体验,并且速度同样快。

相关:如何在Linux上安装和管理Node.js的多个版本

这是一个在node.js中的异步代码的示例:

 var fs = require('fs');
fs.readFile('text.txt', function(err, data){
if(err){
console.log('Sorry, an error occured');
}
setTimeout(()=>{
console.log(data.toString())
}, 1000);
});
setTimeout(()=>{
console.log('Hello world, I don't block other threads...')
}, 500
);

与以前的同步方法不同,上述异步代码使用回调函数来自定义错误消息。

同步和异步编程的语言支持

大多数服务器端语言(如Python,C#,Java和PHP)都独立执行代码,因此,一行或一整块的成功取决于其前一行的成功。这意味着默认情况下它们都是同步的。

尽管现在大多数这些服务器端语言都支持具有最新改进的异步调用,但默认情况下它们都不是异步的。

相关:如何选择正确的Web编程语言

Node.js是一个著名的服务器端JavaScript框架,是支持异步编程的单线程运行时的示例。现在,C#也可以执行异步/等待任务。

同步和异步编程的优缺点

虽然您可能会认为异步编程在这里胜出,但这两种方法各有利弊。因此,使用它们中的任一个取决于您的喜好或手头的问题。

但是,它们在各个方面都比彼此更好。让我们看一下每种编程方法的优缺点。

异步编程的优点

  • 一次加载所有脚本。这等同于速度,响应速度和更好的用户体验。
  • 它消除了页面加载延迟。因此,在执行新请求时无需后续页面刷新。
  • 即使其他请求仍在运行,您也可以一次使用多个功能。
  • 异步应用程序具有高度可扩展性,并且需要很少的资源来工作。
  • 即使一个请求的响应速度很慢,它也不会影响其他请求的响应时间。
  • 线程的失败并不会阻止其他线程的渲染。
  • 内置的回调使您可以自定义错误消息。

异步编程的缺点

  • 它需要大量的回调和递归函数,这在开发过程中可能会很麻烦。
  • 如果未有效使用回调,则用户无法知道请求是否失败,尤其是发出POST请求时。
  • 初始页面渲染中的延迟可能会影响您的体验。
  • 对于Google和Bing这样的搜索引擎,使用异步加载的Web应用程序可能很难抓取。
  • 异步脚本编写可能难以在某些编程语言中实现。
  • 代码会变得凌乱且难以调试。

同步编程的优点

  • 它需要较少的编码知识,并且受所有编程语言的支持。
  • 即使没有针对请求失败的自定义回调,对于客户端(浏览器)默认情况下也会处理此类错误,这对您来说立即显而易见。
  • 最好执行CPU任务。
  • 搜索引擎发现同步网页更易于爬网。
  • 提出简单要求的理想选择。

同步编程的缺点

  • 加载时间可能很慢。
  • 没有内置的回调方法。
  • 当线程被锁定时,其他线程也会被阻塞。
  • 无法一次执行多项操作可能会降低用户体验。
  • 一旦请求失败,整个程序也将无响应。
  • 如果请求不堪重负,可能需要大量资源来处理更多线程。

同步或异步编程:哪个更好?

尽管同步编程可能很慢,并且异步脚本编写的速度很快,但是识别适用于任何情况的适当方法是关键。有时,他们甚至一起工作。

默认情况下,后端操作(如CRUD(创建,读取,更新和删除))是同步的。但是您也可以决定异步执行CRUD操作。您只需要调整前端脚本即可连接后端代码。例如,您可以同步呈现数据库中的数据。然后,您可以使用异步脚本将其呈现给用户。

此外,使用异步编程来构建简单的前端应用程序或执行需要较少资源的CPU操作可能不是理想的选择。