我很想知道在Play 2的视图函数中线程安全需要关注的程度。例如,我在Play 2.2项目中使用PegDown降价渲染器,通过视图辅助函数渲染大量的markdown小片段。
由于创建PegDownProcessor
的实例显然有开销,因此为每个代码片段重用实例似乎是明智的。但是,由于PegDownProcessor
实例显然不是线程安全的,我想知道我是否需要为此明确使用ThreadLocal
,即代替:
object ViewHelpers {
import org.pegdown.PegDownProcessor
private val markdownProcessor = new PegDownProcessor
def renderMarkdown(text: String) = markdownProcessor.markdownToHtml(text)
}
类似的东西:
object ViewHelpers {
import org.pegdown.PegDownProcessor
private val markdownProcessor = new ThreadLocal[PegDownProcessor]
private def getMarkdownProcessor = {
Option(markdownProcessor.get) getOrElse {
val processor = new PegDownProcessor
markdownProcessor.set(processor)
processor
}
}
def renderMarkdown(text: String) = getMarkdownProcessor.markdownToHtml(text)
}
虽然这可以被视为过早优化,但我有兴趣了解线程局方法是否是必要的,或者Play框架本身(或Scala,就此问题)是否有一些保护会使其变得多余。
或者,就此而言,如果有更好的替代方法。
答案 0 :(得分:1)
我不熟悉PegDown或Play框架,因此我无法解决您问题的这一部分。
但是如果您可以在项目中使用C库,MultiMarkdown 4是线程安全且高性能的,并且可能是一种有用的替代方法。我在MultiMarkdown Composer中使用它,它可以让多个解析器实例同时运行,用于不同目的而不会发生冲突。