ワーカープロセスとは、簡単かつ強力なプロセス間通信の方法です。この機能は非同期のメッセージシステムに基づいており、プロセスやフォームを呼び出して、呼び出し先のコンテキストで任意のメソッドを指定パラメーターとともに実行させることができます。
注: CALL FORM コマンドを使うことで、あらゆるフォームのコンテキストにおいても、任意のプロジェクトメソッドを指定のパラメーターで実行させることができます。
あらゆるプロセスは CALL WORKER コマンドを使用することでワーカープロセスを "雇用" することができ、ワーカーのコンテキストにおいて任意のプロジェクトメソッドを指定のパラメーターで実行させることができます。つまり、呼び出元のプロセスとワーカーの間で情報の共有が可能です。
これらの新機能は、4D のプロセス間通信における次のニーズに対応します:
- コオペラティブおよびプリエンプティブ・プロセスの両方に対応しているため、インタープロセス変数が使えないプリエンプティブ・プロセスにおけるプロセス間通信に最適です。
- 煩雑になりやすいセマフォーの代替手法として使用できます (セマフォーとシグナル 参照)。
注: CALL WORKER および CALL FORM のコマンドは主に、プリエンプティブ・プロセスのコンテキストにおけるプロセス間通信のために開発されましたが、コオペラティブ・プロセスにおいても同様に使用することができます。
プロジェクトメソッドの実行を別プロセスに依頼するときに、ワーカー を使います。ワーカーには次のものが付随します:
- ワーカーを特定する一意の名称 (*)
- ワーカーに関連付けられたプロセス (特定の時点において存在しない場合もあります)
- ワーカーが依頼を受信するためのメッセージボックス
- ワーカーの新規生成時に実行を依頼した初期メソッド (任意)
(*) ワーカー名は文字の大小を区別します。つまり、"myWorker" と "MyWorker" は異なるワーカーとして同時に存在できます。
CALL WORKER コマンドを使って、プロジェクトメソッドの実行をワーカーに依頼します。初めてワーカーを使用するときに、ワーカーはメッセージボックスとともに生成され、依頼内容を関連プロセスにて実行します。ワーカープロセスが終了してもメッセージボックスは開いたままで、次のメッセージを受け取るとワーカープロセスが再開します。
この一連の流れをアニメーションで表しました:

New process コマンドとは異なり、ワーカープロセスはメソッドの実行終了後も生きています。つまり、特定のワーカーが実行するすべてのメソッドは同一プロセス内でおこなわれ、すべてのプロセス情報 (プロセス変数、カレントレコード、カレントセレクション、など) が保持されます。続けて実行されるメソッドはこれらの情報を共有することになるため、プロセス間の通信が可能になります。ワーカーのメッセージボックスは連続した呼び出しを非同期的に扱います。
CALL WORKER はメソッド名と引数をカプセル化し、メッセージとしてワーカーに受け渡します。ワーカープロセスがまだ存在していなければ生成され、メッセージボックスに格納されたメッセージを実行します。したがって、大体の場合において CALL WORKER は、ワーカーが受け取ったメソッドを実行するより先に終了します (非同期的な実行)。そのため CALL WORKER は戻り値を返しません。実行後の情報をワーカーから返してもらうには、CALL WORKER を利用してワーカーの呼び出し元に情報を返す必要があります (コールバック)。コールバックをおこなうには、呼び出し元のプロセスもワーカーである必要があります。
New process コマンドで作成されたプロセスはメッセージボックスを持たないため、CALL WORKER によってワーカーとして使うことはできません。そのため、同プロセスがワーカーをコールすることは可能でも、CALL WORKER によるワーカーからのコールバックを受けられないことに留意が必要です。
ワーカープロセスは、ストアドプロシージャーを使って 4D Server 上に作成することもできます。例えば、CALL WORKER コマンドを実行するメソッドを Execute on server コマンドから実行します。
ワーカープロセスを閉じるには KILL WORKER コマンドをコールします。これによってワーカーのメッセージボックスは空にされ、関連プロセスはメッセージの処理を停止し、現在のタスク完了後に実行を終了します。
ワーカープロセスを新規生成する際に指定したメソッドがワーカーの初期メソッドになります。次回以降の呼び出しで method パラメーターに空の文字列を受け渡した場合、CALL WORKER はこの初期メソッドの実行をワーカーに依頼します。
ユーザーおよびアプリケーションモードで 4D データベースを開く際に作成されるメインプロセスはワーカーです。したがって、CALL WORKER で呼び出すことができます。メインプロセスの名称は 4D の使用言語により異なりますが、プロセス番号は常に 1 です。CALL WORKER でメインプロセスを呼び出す場合には、プロセス番号を使うのが便利でしょう。
PROCESS PROPERTIES コマンドを使った場合、メインプロセス以外のすべてのワーカープロセスは Worker process (5) をプロセスの種別として返します (メインプロセスは Main process (-1) です)。
ランタイムエクスプローラーおよび 4D Server の管理画面においては、アイコンからもワーカープロセスを識別することができます:
プロセスタイプ | アイコン |
プリエンプティブ・ワーカープロセス |  |
コオペラティブ・ワーカープロセス |  |
注: ほかの既存プロセスのアイコンも 4D v15 R5 で更新されています。
二つのワーカーと一つのフォーム間の通信の流れを図に表しました。通信の内容は文字列です:

- Worker_1 が Worker_2 を呼び出し、"Hello!" を渡します
- Worker_2 がメッセージを受信し、内容を確認します。Worker_2 が Worker_1 をコールバックして、"Hello!" を返します。
- Worker_2 は次にフォーム MyForm を呼び出し、"I am working" を渡します。Worker_2 はそのまま時間の掛かる処理を始め、ステータスが 'busy' になります。
- Worker_1 が Worker_2 を二回呼び出しますが、非同期的なメッセージ・システムのため、メッセージはキューに入ります。これらは Worker_2 が継続中の処理を終了し、MyForm を呼び出したあとに処理されます。