xref: /libuv/docs/src/threadpool.rst (revision 73b0c1f9)
1
2.. _threadpool:
3
4Thread pool work scheduling
5===========================
6
7libuv provides a threadpool which can be used to run user code and get notified
8in the loop thread. This thread pool is internally used to run all file system
9operations, as well as getaddrinfo and getnameinfo requests.
10
11Its default size is 4, but it can be changed at startup time by setting the
12``UV_THREADPOOL_SIZE`` environment variable to any value (the absolute maximum
13is 1024).
14
15.. versionchanged:: 1.30.0 the maximum UV_THREADPOOL_SIZE allowed was increased from 128 to 1024.
16
17.. versionchanged:: 1.45.0 threads now have an 8 MB stack instead of the
18   (sometimes too low) platform default.
19
20The threadpool is global and shared across all event loops. When a particular
21function makes use of the threadpool (i.e. when using :c:func:`uv_queue_work`)
22libuv preallocates and initializes the maximum number of threads allowed by
23``UV_THREADPOOL_SIZE``. This causes a relatively minor memory overhead
24(~1MB for 128 threads) but increases the performance of threading at runtime.
25
26.. note::
27    Note that even though a global thread pool which is shared across all events
28    loops is used, the functions are not thread safe.
29
30
31Data types
32----------
33
34.. c:type:: uv_work_t
35
36    Work request type.
37
38.. c:type:: void (*uv_work_cb)(uv_work_t* req)
39
40    Callback passed to :c:func:`uv_queue_work` which will be run on the thread
41    pool.
42
43.. c:type:: void (*uv_after_work_cb)(uv_work_t* req, int status)
44
45    Callback passed to :c:func:`uv_queue_work` which will be called on the loop
46    thread after the work on the threadpool has been completed. If the work
47    was cancelled using :c:func:`uv_cancel` `status` will be ``UV_ECANCELED``.
48
49
50Public members
51^^^^^^^^^^^^^^
52
53.. c:member:: uv_loop_t* uv_work_t.loop
54
55    Loop that started this request and where completion will be reported.
56    Readonly.
57
58.. seealso:: The :c:type:`uv_req_t` members also apply.
59
60
61API
62---
63
64.. c:function:: int uv_queue_work(uv_loop_t* loop, uv_work_t* req, uv_work_cb work_cb, uv_after_work_cb after_work_cb)
65
66    Initializes a work request which will run the given `work_cb` in a thread
67    from the threadpool. Once `work_cb` is completed, `after_work_cb` will be
68    called on the loop thread.
69
70    This request can be cancelled with :c:func:`uv_cancel`.
71
72.. seealso:: The :c:type:`uv_req_t` API functions also apply.
73