スレッドプールの作業スケジューリング

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_loop_t *uv_work_t.loop

このリクエストを開始したイベントループであり、完了の報告先です。読み取り専用です。

関連項目

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関数も適用されます。