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

时间:2013-12-03 08:26:09

标签: multithreading node.js

我决定熟悉node.js并阅读了几篇关于这个主题的文章。我还不清楚的是,当你调用node.js函数时,node.js是否在线程池中的线程上创建新线程和/或调度任务。

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

如果是,我如何编写自己的函数readFileCustomizeddoLongOperation以在另一个线程上运行?

1 个答案:

答案 0 :(得分:9)

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

The pool can run 4 threads

static uv_thread_t default_threads[4];

使用uv__work_submit发布阻止FS任务。例如,read is implemented

的方式如下
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)

如果您想实现自己的主题,可以查看great introduction

相关问题