当前位置: 首页 > 面试题库 >

node.js是否在内部使用线程/线程池?

裴成文
2023-03-14
问题内容

我决定使自己熟悉node.js,并阅读有关该主题的几篇文章。我仍然不清楚的是,当您调用node.js函数时,node.js是否在线程池中创建新线程和/或在线程上调度任务。

例如,如果我调用fs.readFile它是否在其他线程上执行?

如果是,[如何]我可以编写自己的函数readFileCustomizeddoLongOperation在其他线程上运行?


问题答案:

没有用于文件操作的异步API,因此node.js为此使用了线程池。您可以在libuv的代码中看到它。

该池可以运行4个线程:

static uv_thread_t default_threads[4];

阻塞的FS任务通过uv__work_submit发布。例如,以下是读取的实现方式:

int uv_fs_read(uv_loop_t* loop, uv_fs_t* req,
               uv_file file,
               void* buf,
               size_t len,
               int64_t off,
               uv_fs_cb cb) {
  INIT(READ);
  req->file = file;
  req->buf = buf;
  req->len = len;
  req->off = off;
  POST;
}

...

#define POST                                                                  \
  do {                                                                        \
    if ((cb) != NULL) {                                                       \
      uv__work_submit((loop), &(req)->work_req, uv__fs_work, uv__fs_done);    \
      return 0;                                                               \
    }                                                                         \
    else {                                                                    \
      uv__fs_work(&(req)->work_req);                                          \
      uv__fs_done(&(req)->work_req, 0);                                       \
      return (req)->result;                                                   \
    }                                                                         \
  }                                                                           \
  while (0)

如果您想实现自己的线程,可以查看此精彩介绍。



 类似资料:
  • 我很难理解内部类线程的行为。 它总是打印出“main”,并且线程是按顺序执行的。为什么内部类线程的执行由主线程执行? 谢谢!

  • 需要检测两个对象的状态,并且任务需要实时。run方法使用while(flag)循环通过更改flag=false来结束线程的生命周期。线程通常需要运行40分钟或更长时间。使用线程池将导致核心线程池耗尽,而任务将进入队列,因为每个线程将运行40分钟,每个线程的执行时间非常长且不固定,因此必须有许多线程无法及时响应。 我尝试使用新线程(runnable)。Start()而不是使用线程池ThreadPoo

  • 问题内容: 我正在编写一个GUI应用程序,该应用程序通过Web连接定期检索数据。由于此检索需要一段时间,因此这会导致UI在检索过程中无响应(无法拆分成较小的部分)。这就是为什么我想将Web连接外包给一个单独的工作线程。 [是的,我知道,现在我有两个问题。] 无论如何,该应用程序使用PyQt4,所以我想知道更好的选择是:使用Qt的线程还是使用Python threading模块?各自的优点/缺点是什

  • 如何检查当前线程是否是Linux上的主线程?看起来gettid()只返回一个pid,但linux似乎并不保证main()的线程总是具有一个常量和统一的pid。 这样做的原因是,我正在进行自动并行化,并且我希望确保pthread_create()不会在已经运行在pthread_create()创建的线程上的函数中调用。

  • 问题内容: 之前已针对Android,ObjectiveC和C++解决了此问题,但显然不适用于Python。如何可靠地确定当前线程是否为主线程?我可以想到一些方法,但没有一种方法能让我真正满意,因为考虑到与存在的方法相比,它可能是如此简单。 主线程是这样实例化的: 所以一个人可以做 但是这个名字是固定的吗?我见过的其他代码检查了线程名称中是否包含任何代码。 存储启动线程 我可以在程序启动时即在没有

  • 所以一个人可以做 但这个名字固定了吗?我看到的其他代码检查了是否包含在线程名称的任何地方。 我可以在程序启动时存储对起始线程的引用,也就是在没有其他线程的时候。这是绝对可靠的,但对于这样一个简单的查询来说太麻烦了? 有没有更简洁的方法?