单独线程上的Javascript回调函数

单独线程上的Javascript回调函数,javascript,jquery,multithreading,dom-events,Javascript,Jquery,Multithreading,Dom Events,Javascript是单线程的。那么回调函数及其包含函数是否与主循环/事件循环在同一线程上执行 database.query("SELECT * FROM hugetable", function(rows) { // anonymous callback function var result = rows; console.log(result.length); }); console.log("I am going without waiting

Javascript是单线程的。那么回调函数及其包含函数是否与主循环/事件循环在同一线程上执行

database.query("SELECT * FROM hugetable", function(rows) {  // anonymous callback function
   var result = rows;
   console.log(result.length);
});
console.log("I am going without waiting...");
如果
query()
方法及其回调函数与事件循环在同一线程上执行,则会发生阻塞。如果不是,为什么Javascript被称为单线程

有人能帮助验证javascript(browser/node.js)是否在幕后使用多个线程来实现非阻塞吗

朋友们, 我看到了你的评论和回答。对不起,我对Javascript非常陌生。我很困惑,单线程异步调用不会阻塞。如果有100个用户从hugeTable请求数据,每个请求可能需要一分钟的时间,并且事件循环将这些任务分派到队列中并依次执行,
query()
方法执行如何不阻塞事件循环,因为它们都在一个线程上

布拉德回答了这部分

Javascript是单线程的。那么回调函数及其包含函数是否与主循环/事件循环在同一线程上执行

database.query("SELECT * FROM hugetable", function(rows) {  // anonymous callback function
   var result = rows;
   console.log(result.length);
});
console.log("I am going without waiting...");
是的,你回答了你自己的问题

您是对的,JavaScript是单线程的。没有可执行回调的其他线程


< P > >,用C或C++编写的外部库可以自由生成所有想要的线程。

< P>好的问题,JavaScript是单线程但异步的,这意味着对于每个异步调用,它将在主线程上执行一个小暂停来执行回调,至少对于浏览器来说是这样,即使在那里,你也会有网络工作者,他们会为每个工作者产生一个新的线程

您在代码中所做的是将查询的计算(回调的执行)推迟到查询运行并检索到
行之后

在现代浏览器中,如果需要,可以使用创建两个线程

Node.js是一个单独的故事-您可以创建子进程,在需要时在单独的线程上运行。有关更多信息,请参阅。

Node.js本机库(不是JavaScript部分)始终使用单独的线程,但代码的所有数据都会被洗牌回单个JavaScript执行线程

无法告诉您后台是否有其他线程正在处理此查询,因为您没有指定正在使用的DB库。然而,这并不像你想象的那么重要

假设您要创建一个线程来处理数据库连接。启动一个查询,该线程负责将查询发送到数据库服务器。然后呢?在有数据返回之前,该线程在周围无所事事。你实际上是在浪费资源,让一个线程在周围运行,而这并没有起到很大的作用。Node.js不是这样工作的。您有一个用于JavaScript执行的线程

如果您正在发送或接收数据(这主要是您的DB连接器将要做的),那么这将自动从后台线程池中处理。您正在使用的任何DB连接器都可能有一个本机扩展,可以对线程执行任何操作


参见我在这里的一个更完整的解释:

您可以查看WebWork,它允许您在一个单独的线程上执行代码,如果Quess()方法和它的回调函数在事件循环的同一线程上执行,那么阻塞将发生。“不,考虑浏览器中的TimeTimeOut.”它与任何其他代码在同一线程上运行,但它没有阻塞。回调只是放在稍后执行的队列上。现在,如果您考虑Ajax,那么是的,我相信请求本身是在不同的线程中发出的。但是,回调函数将再次在UI线程中执行。javascript被称为evented,而不是I/O Blocking非常感谢你,Brad,我阅读了你对所提供链接的评论。这完美地回答了我的问题。也感谢其他回答和/或发表评论的朋友。