我决定熟悉node.js,并阅读了一些相关文章。有一个问题一直不太清楚,那就是当调用node.js函数时,它是否会创建新的线程和/或在线程池中调度任务。
例如,如果我调用fs.readFile
,它会在不同的线程上执行吗?
如果是,[如何]可以编写自己的函数readFileCustomized
或doLongOperation
以在不同的线程上运行?
我决定熟悉node.js,并阅读了一些相关文章。有一个问题一直不太清楚,那就是当调用node.js函数时,它是否会创建新的线程和/或在线程池中调度任务。
例如,如果我调用fs.readFile
,它会在不同的线程上执行吗?
如果是,[如何]可以编写自己的函数readFileCustomized
或doLongOperation
以在不同的线程上运行?
对于文件操作,Node.js没有异步API,因此使用线程池来处理。你可以在libuv的代码中看到它。
static uv_thread_t default_threads[4];
使用uv__work_submit发布阻塞FS任务。例如,这是read的实现方式:
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)
如果您想要实现自己的线程,可以查看这个优秀的介绍。
fs.readFile
相关的所有源代码:fs.readFile > fs.read > ASYNC_CALL(read(2)) (macro) > FSReqWrap > ReqWrap > BaseObject
。如果您想要检查fs.readFile
的内在特性,这可能需要一些时间。 - Zeta