Pure Java脚本是同步还是异步?

问题描述 投票:1回答:1

据我了解,javascript既可以在浏览器中运行,也可以在Node.js中作为后端运行。

浏览器或Node.js,具体取决于您运行JavaScript的位置,将通过Web API或c ++ API的句柄函数来阻止运行时(例如,网络调用,图像渲染等),然后将其发送到事件循环,并最终将它们合并到运行javascript的单个线程中。

我不明白,当我在Google上搜索“ javascript是同步还是异步”时,答案是javascript是异步的。

但是那是真的吗?由于浏览器或Node.js后端中包含Web API或c ++ API,因此Javascript是异步的,这使线程成为了幕后黑手,但是javascript本身不是异步的?

如果javascript只有一个线程,它一定是同步语言吗?

javascript node.js asynchronous synchronization
1个回答
2
投票

Javascript(在浏览器和node.js中实现)是事件驱动的系统。

这意味着,与非阻塞异步I / O一起使用时,它可以发挥最佳效果,从而为您提供与事件驱动系统配合的最佳体验和功能。这不一定是Java语言本身所固有的(您可以使Java版本只具有阻止I / O的功能),但是所有流行的Java实现都依赖于事件队列和异步I / O,与事件队列协调以提供有用的编程环境。

直到最近,Javascript还没有有用的线程和有用的线程同步工具来使具有阻塞I / O的多线程系统实用或有用。现在,浏览器和node.js中都有线程,尽管node.js中的线程非常笨拙(V8解释器的全新实例,单独的堆等),因此它们不一定是性能。与具有内置更多固有功能的线程的系统相比具有竞争力。另外,JavaScript中的线程同步工具还处于开发初期。

我不明白的是,当我用Google搜索“是javascript同步还是异步”时,答案是javascript是异步的。

当前流行的Javascript实现是在需要异步I / O才能提高工作效率的环境中。尽管我不知道任何假设采用线程并阻止I / O的实现,但纯语言本身并不一定需要它。

由于浏览器中的Web API或c ++ API,Javascript是异步的,Node.js后端是使线程处于底层的线程,但是javascript本身不是异步的?

Javascript环境具有异步功能,因为Javascript与事件驱动的环境配对并且被诸如计时器和I / O之类的异步操作所阻塞。因此,将Javascript实现与环境所添加的其他内容结合起来,可以使环境能够编写可以使用异步功能的代码。请不要太在意Java语言本身是异步还是非异步的语义论点。据我所知,指定Java语言的ECMAScript规范并不一定需要这样做。我认为可能存在没有异步功能的纯Javascript语言的实现。但是,当您真正在网上或书籍中阅读的大多数内容真正的含义是流行的Javascript实现(例如,在Web浏览器或node.js中)时,它们都会引用“ Javascript”。而且,坦率地说,这才是最重要的,因为除非您要构建自己的自定义环境,否则您实际上可以在其中使用Javascript。

如果javascript只有一个线程,它必须是同步语言吗?

尚不清楚您对这个问题的意思。默认情况下(不调用webWorkers或Worker线程),Javascript在一个线程中运行Javascript代码,但是它可以访问无阻塞I / O功能,这些功能允许操作与Javascript并行运行。在浏览器中,您可以对服务器进行Ajax调用,然后在该Ajax调用完成时执行其他操作(进行一些计算,更新屏幕,更新屏幕时钟等),然后在完成时进行其他操作通知来自Ajax调用,您可以处理结果。在实际的Java语言行同步运行的同时,您可以启动异步操作,从而与Java代码执行并行运行。我将避免辩论是否要称其为“同步语言”。那只是一个语义论点。它以工作方式运行,在单个线程中运行Javascript,但利用本机OS功能与Javascript并行运行其他功能(例如网络操作)。

© www.soinside.com 2019 - 2024. All rights reserved.