スレッドプールの作業スケジューリング¶
libuvは、利用者のコードを実行し、イベントループのスレッドで通知を受け取るために使えるスレッドプールを提供します。内部では、このスレッドプールを使って、すべてのファイルシステム操作と、getaddrinfoおよびgetnameinfoのリクエストを実行します。
既定のサイズは4ですが、起動時に環境変数UV_THREADPOOL_SIZEを任意の値に設定することで変更できます(絶対的な上限は1024です)。
バージョン1.30.0で変更: UV_THREADPOOL_SIZEで許可される最大値が128から1024に引き上げられました。
バージョン1.45.0で変更: スレッドのスタックは、プラットフォームの既定値(小さすぎる場合があります)ではなく、8 MBになりました。
バージョン1.50.0で変更: スレッドの既定の名前がlibuv-workerになりました。
スレッドプールはグローバルであり、すべてのイベントループで共有されます。ある関数がスレッドプールを使うとき(たとえば、uv_queue_work()を使う場合など)、libuvはUV_THREADPOOL_SIZEで許可された最大数のスレッドを事前に割り当て、初期化します。通常、スレッドを増やすとスループットも上がりますが、メモリ使用量も増えます。ただし、ほとんどのプラットフォームでは、スレッドのスタックは必要になったときに拡張されます。
注記
すべてのイベントループで共有されるグローバルなスレッドプールを使っていても、これらの関数はスレッドセーフではないことに注意してください。
データ型¶
-
type uv_work_t¶
作業リクエストの型。
-
typedef void (*uv_work_cb)(uv_work_t *req)¶
uv_queue_work()に渡すコールバックで、スレッドプール上で実行されます。
-
typedef void (*uv_after_work_cb)(uv_work_t *req, int status)¶
uv_queue_work()に渡すコールバックで、スレッドプールでの作業が完了した後、イベントループのスレッドで呼び出されます。uv_cancel()を使って作業がキャンセルされた場合、statusはUV_ECANCELEDになります。
公開メンバー¶
関連項目
uv_req_tのメンバーも適用されます。
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)¶
指定されたwork_cbをスレッドプールのスレッドで実行する作業リクエストを初期化します。work_cbが完了すると、after_work_cbがイベントループのスレッドで呼び出されます。
このリクエストは
uv_cancel()でキャンセルできます。
関連項目
uv_req_tのAPI関数も適用されます。