gpt4 book ai didi

javascript - 在主线程期间执行的异步任务

转载 作者:行者123 更新时间:2023-11-30 13:51:32 25 4
gpt4 key购买 nike

JavaScript 是一种单线程编程语言(一次只能做一个任务)

所以它首先运行主线程(同步)然后在事件循环中执行异步任务(我是这样理解的但显然我错了)

Node.js 使用 libuv 一个处理异步任务的库

// synchronously open file descriptor
var fd = fs.openSync('testFile', 'r+');

// synchronously write data to the file
fs.writeSync(fd, ' first data part ');

// asynchronously write data to the file
fs.write(fd, ' second data part ', function(err){
if(err) console.log( err );
});

// asynchronously close the file descriptor
fs.closeSync(fd);

异步写入方法成功地将数据写入文件,但并非总是如此! (方法抛出“错误的文件描述符”错误)

我预计异步“write()”方法会出错,因为文件描述符是同步关闭的,所以它不应该有一个有效的文件描述符可以使用(但至少并非总是如此)

这里是问题

  • 这是否意味着异步任务由运行单独 JS 线程的 libuv 单独执行,从而导致上述示例不会崩溃?

  • 如果我在上面,这在浏览器中的行为是否相同(浏览器之间是否存在任何异步差异?)

  • 如果我错了,上面的异步“write()”方法到底是怎么获取文件描述符的?

最佳答案

Does that mean that asynchronous tasks are executed separately by libuv running a separate JS tread so this causes the above example not to crash

不是 JavaScript 线程,不是。 Node.js 在一个单独、非 JavaScript 线程或多个线程上运行 I/O 任务——但更重要的是,它尽可能使用操作系统的异步 I/O 功能,以避免绑定(bind)该线程/那些不必要的线程。这些功能允许它在那个/那些其他线程上排队和处理 I/O 进度/完成,然后在适当的时候排队调用异步函数的回调(你的 write 回调,在这种情况下)在主 JavaScript 线程的事件循环上。

所以您的代码中存在的是不协调的线程之间的竞争,这解释了为什么有时它可以工作而有时却失败。由于涉及操作系统级别的所有因素,线程调度似乎是不确定的。

关于javascript - 在主线程期间执行的异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58138252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com