私の知る限り、FastCGIはPerlスレッドではなくプロセスを使用します。したがって、あなたは安全でなければなりません。
さらに、PerlスレッドとParse :: RecDescentを使用している場合、同じオブジェクトを使用して異なるものを同時に解析することはほとんどありません。擬似コード:
use threads;
use Parse::RecDescent;
our $SingletonRD = Parse::RecDescent->new($grammar);
my @threads = map {threads->new(\&thread_loop)} (1..5);
sub thread_loop {
$SingletonRD->parse($text);
}
これは、シングルトンの後にスレッドが作成される例です。何が起こるかです:
- シングルトンオブジェクトを作成し、に保存し
$SingletonRD
ます。
- (ループで)5つのスレッドを作成します。新しいスレッドを生成するとき、perlは
- グローバルシンボルテーブルのコピーを作成します。これには、すべてのパッケージ変数とサブルーチンが含まれます。
- さまざまなperl-interpreter内部データ構造のコピーを作成します(OPツリーを除く)。
$SingletonRD
これにより、スレッドごとに1回ずつ効果的にクローンが作成されます。メモリが保存されていません。さて、スレッドを作成した後でのみパーサーをセットアップした場合、変数はそもそもそれらの間で共有されないので、ここでもメモリの節約やスレッドの安全性はありません。
原則として、threads :: sharedを使用して、スレッド間でデータを共有できます。しかし、それはオブジェクトや複雑なネストされた構造では(簡単に)機能しません。したがって、これはParse::RecDescentパーサーの問題外になる可能性があります。
PS:Parse :: Yappかそれ以上、Parse::Eyappを見てください。それらはParse::RecDescentよりも(アルゴリズム的に)はるかに高速であり、直感的には、使用するメモリが少なくなる可能性が高いと言えます。