我决定熟悉node.js并阅读了几篇关于这个主题的文章.我还不清楚的是,当您调用node.js函数时,node.js是否在线程池中创建新线程和/或调度线程池上的任务.
例如,如果我调用fs.readFile
它是在另一个线程上执行的?
如果是,[how]我可以编写自己的函数readFileCustomized
还是doLongOperation
在不同的线程上运行?
文件操作没有异步API,因此node.js使用线程池.你可以在libuv的代码中看到它.
该池可以运行4个线程:
static uv_thread_t default_threads[4];
使用uv__work_submit发布阻止FS任务.例如,以下是如何实现读取:
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)
如果你想实现自己的线程,你可以查看这个很棒的介绍.