Thread pool work scheduling¶
libuv provides a threadpool which can be used to run user code and get notified in the loop thread. This thread pool is internally used to run all file system operations, as well as getaddrinfo and getnameinfo requests.
Its default size is 4, but it can be changed at startup time by setting the
UV_THREADPOOL_SIZE
environment variable to any value (the absolute maximum
is 128).
The threadpool is global and shared across all event loops. When a particular
function makes use of the threadpool (i.e. when using uv_queue_work()
)
libuv preallocates and initializes the maximum number of threads allowed by
UV_THREADPOOL_SIZE
. This causes a relatively minor memory overhead
(~1MB for 128 threads) but increases the performance of threading at runtime.
注解
Note that even though a global thread pool which is shared across all events loops is used, the functions are not thread safe.
Data types¶
-
uv_work_t
¶ Work request type.
-
void
(*uv_work_cb)
(uv_work_t* req)¶ Callback passed to
uv_queue_work()
which will be run on the thread pool.
-
void
(*uv_after_work_cb)
(uv_work_t* req, int status)¶ Callback passed to
uv_queue_work()
which will be called on the loop thread after the work on the threadpool has been completed. If the work was cancelled usinguv_cancel()
status will beUV_ECANCELED
.
API¶
-
int
uv_queue_work
(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb, uv_after_work_cb after_work_cb)¶ Initializes a work request which will run the given work_cb in a thread from the threadpool. Once work_cb is completed, after_work_cb will be called on the loop thread.
This request can be cancelled with
uv_cancel()
.
参见
The uv_req_t
API functions also apply.