Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
677 views
in Technique[技术] by (71.8m points)

multithreading - Does node.js use threads/thread pool internally?

I've decided to familiarize myself with node.js and have read a several articles on the subject. What remained unclear to me is if node.js creates new threads and/or schedules tasks on threads from a thread pool when you call node.js functions.

For example if I call fs.readFile is it executed on a different thread?

If yes, [how] can I write my own function readFileCustomized or doLongOperation to run on a different thread?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

There is no async API for file operations so node.js uses a thread pool for that. You can see it in the code of libuv.

The pool can run 4 threads:

static uv_thread_t default_threads[4];

Blocking FS tasks are posted with uv__work_submit. For example, here's how 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)

If you want to implement your own threads, you can check this great introduction.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...