多数のステート マシンがあります。場合によっては、ステート マシンをある状態から別の状態に移動する必要があります。これには、安価な場合もあれば高価な場合もあり、DB の読み取りと書き込みなどが必要になる場合があります。
これらの状態の変化は、クライアントからの受信コマンドが原因で発生し、いつでも発生する可能性があります。
ワークロードを並列化したい。「このマシンをこの状態からこの状態に移動する」というキューが必要です。明らかに、任意の 1 台のマシンに対するコマンドを順番に実行する必要がありますが、多くのスレッドがある場合は、多くのマシンを並行して進めることができます。
ステート マシンごとに 1 つのスレッドを持つこともできますが、ステート マシンの数はデータに依存し、数百または数千になる可能性があります。ステート マシンごとに専用のスレッドは必要ありません。何らかのプールが必要です。
ワーカーのプールを持ちながら、各ステート マシンのコマンドが厳密に順番に処理されるようにするにはどうすればよいですか?
UPDATEMachine
:インスタンスに未処理のコマンドのリストがあると想像してくださいスレッド プール内のエグゼキュータがコマンドの消費を終了すると、Machine
さらに未処理のコマンドがある場合は、コマンドをスレッド プールのタスク キューに戻します。問題は、Machine
最初のコマンドを追加するときに、アトミックにスレッド プールに入れる方法です。そして、これがすべてスレッドセーフであることを確認しますか?