Request-Responseループのロック

2007/03/30 (Fri) 22:07:46 JST

WebObjectsはHTTPリクエストを並列的に受け付けますが、 Request-Response ループも並列的に実行するかというと、それは別の問題です。Request-Response ループは並列的に実行することもできますが、デフォルトでは一度に一つのループしか実行しません。

Request-Response ループの並列処理の設定

WOApplication.setAllowsConcurrentRequestHandling() でループを並列的に実行するかどうかを設定することができます。

デフォルトの挙動

デフォルトの設定では、一つのアプリケーションインスタンスにおいて、 Request-Response ループは一度に一つしか実行されません。これは異なるセッションに対しても同じです。同時にアプリケーションにアクセスすると、リクエストを受け付けることは受け付けますが、ループを実行するリクエスト以外は待ち状態になります(正確には awake() のみ実行され、 takeValuesFromRequest() 以降は現在実行中のループが終了するまで待つ) 。例えばあるユーザがファイルのアップロードに長い時間をかければ、それだけ他のユーザもアプリケーションにアクセスできなくなります。

これだけ他の資源のロックと違って、ループを実行するスレッドが排他的になります。このため、一回のループでロックが必要な一連のデータべース操作を完結させてしまえば、EOFレベルでの同時実行制御を気にする必要はないでしょう。ただし、パフォーマンスはループを並列処理させたほうが有利です。

この仕様はObjective-Cで書かれていた4.xの名残、と考えてもいいのかもしれません。デフォルトの設定を変更して、積極的にループを並列処理させるべきかと思います。アプリケーションインスタンス間やEOF・データベース間の同時実行制御が完璧というわけではないので、ループの同時実行制御だけを気にしてもあまり意味がありません。


Inverse Pages: ロックについて