据我所知,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
.
- 您创建(循环)五个线程。当产生一个新线程时,perl 会
- 创建全局符号表的副本。这包括所有包变量和子例程。
- 创建各种 perl 解释器内部数据结构的副本(OP 树除外)。
这有效地为每个线程克隆$SingletonRD
一次。没有保存内存。现在,如果您只在创建线程后设置解析器,变量将不会在它们之间共享,因此这里也没有内存节省和线程不安全。
原则上,您可以使用threads::shared 在线程之间共享数据。但这并不(容易)适用于对象和复杂的嵌套结构。因此,这对于 Parse::RecDescent 解析器来说可能是不可能的。
PS:看看 Parse::Yapp 或者更好的是 Parse::Eyapp。它们比 Parse::RecDescent 快得多(算法上),我直观地说它们甚至可能使用更少的内存。