单独一个线程上的javascript回调函数

时间:2013-12-05 03:59:41

标签: javascript jquery multithreading javascript-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...");

如果query()方法及其回调函数在与事件循环相同的线程上执行,则会发生阻塞。如果不是为什么Javascript被称为单线程?

任何人都可以帮助验证javascript(browser / node.js)是否在场景后面使用多个线程以实现非阻塞?

谢谢,

友 我看到了你的意见和答案。对不起,我对javascript很新。我很困惑,单线程asyn调用不会阻塞。如果有100个用户从hugeTable请求数据,这可能每个并发一分钟,并且事件循环将这些任务分配到队列并依次执行它们,query()方法执行如何不阻止事件循环,因为它们全部打开一个单一的线程?

布拉德回答了这一部分。

4 个答案:

答案 0 :(得分:3)

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

由于您未指定正在使用的DB库,因此无法告诉您后台中的其他线程是否正在处理此查询。但是,这并不像你想的那么重要。

假设您要创建一个用于处理数据库连接的线程。您触发查询,该线程负责将查询提供给数据库服务器。那又怎样?该线程围绕着绝对不做任何事情,直到有数据回来。你已经有效地浪费了资源来保持一个线程并没有做很多事情。 Node.js不能以这种方式工作。您有一个用于执行JavaScript的线程。

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

请在此处查看我的帖子,以获得更完整的解释:https://stackoverflow.com/a/19324665/362536

答案 1 :(得分:1)

  

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

是的,你有点回答了自己的问题。

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

也就是说,用C或C ++编写的外部库可以随心所欲地生成线程。

答案 2 :(得分:0)

好问题,javaScript是单线程但是异步的,这意味着对于每个异步调用,它将在主线程上执行一个小暂停来执行回调,至少对于浏览器来说是这样,甚至在那里你会有web-workers将为每个工人生成一个新线程。

答案 3 :(得分:0)

您在代码中执行的操作是推迟查询的评估(执行回调),直到查询运行并检索到rows为止。

在现代浏览器中,您可以根据需要使用webworkers创建两个线程。

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