- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Web 应用程序,它使用通过 Parse::RecDescent 创建的解析器。应用程序的多个部分都需要一个解析器对象,并且由于解析器占用相当多的内存,我到目前为止将解析器对象视为一个单例。这在纯 CGI 环境中运行良好,因为同一个对象一次只解析一个表达式。但是,我不确定在同一对象解析器同时解析多个字符串的环境中运行时,这是否仍然有效。
例如,如果我尝试在 FastCGI 下运行应用程序,如果两个请求同时使用相同的解析器对象来解析不同的字符串,是否会成为问题?
如果需要,我可以更改应用程序,使解析器不再是单例,但我不希望这样做,因为当前的解决方案更简单。
最佳答案
据我所知,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
中。这有效地为每个线程克隆了一次 $SingletonRD
。没有保存内存。现在,如果您仅在创建线程后设置解析器,变量将不会在它们之间共享,因此不会节省内存并且这里也没有线程不安全。
原则上可以使用threads::shared在线程间共享数据。但这并不(容易)适用于对象和复杂的嵌套结构。因此,对于 Parse::RecDescent 解析器来说,这可能是不可能的。
PS:看看 Parse::Yapp 或更好的 Parse::Eyapp。它们(在算法上)比 Parse::RecDescent 快得多,我直觉上说它们甚至可能使用更少的内存。
关于perl - Perl 的 Parse::RecDescent 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2192125/
我是一名优秀的程序员,十分优秀!