asynchronous - 异步回调是如何实现的?

标签 asynchronous v8 language-implementation

所有语言如何实现异步回调?

例如在 C++ 中,需要有一个“监控线程”来启动 std::async .如果在主线程中启动,则必须等待回调。

std::thread t{[]{std::async(callback_function).get();}}.detach();


std::async(callback_function).get(); //Main thread will have to wait

JavaScript 中的异步回调呢?在 JS 中大量使用回调...... V8 如何实现它们? V8 是否创建了很多线程来监听它们并在收到消息时执行回调?或者它是否使用一个线程来监听所有回调并保持刷新?

例如,
setInterval(function(){},1000);
setInterval(function(){},2000);

V8 是创建 2 个线程并监视每个回调状态,还是有一个池来监视所有回调?

最佳答案

V8 没有实现带有回调的异步函数(包括 setInterval)。引擎只是提供了一种执行 JavaScript 代码的方法。

作为 V8 嵌入者,您可以创建 setInterval JavaScript 函数链接到您想要的 native C++ 函数。例如,创建线程或安排一些作业。此时,您有责任在必要时调用提供的回调。一次只有一个线程可以使用 V8 引擎(V8 隔离实例)来执行代码。这意味着如果需要从另一个线程调用回调,则需要同步。 V8 提供的锁定机制正是你需要的。

解决这个问题的另一种更常见的方法是创建一个函数队列供 V8 执行,并使用无限队列处理循环在一个线程上执行代码。这基本上是一个事件循环。这样你就不需要使用执行锁,而是使用另一个线程将回调函数推送到队列中。

所以这取决于浏览器/Node.js/其他嵌入器如何实现它。

关于asynchronous - 异步回调是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23406584/

相关文章:

asynchronous - dart将数据从stdin和stderr传递到另一个进程的stdin

与大写字母相关的Javascript正则表达式无限循环

python - Python 的小数精度与 C 相比如何?

python - Python3解释器中方法和类的位置

javascript - 如何使用 Deferred 顺序运行代码?

c# - 如何让 WPF TextBlock 在异步设置 Text 属性的位置滚动?

c# - TPL 数据流资源未发布

javascript - Node.js 和碎片化

javascript - 在 V8 中获取完整的 AST,惰性编译问题

Lua:理解表数组部分和哈希部分