我很想知道线程安全性需要在Play 2的视图函数中担忧的程度。例如,我在我的Play 2.2项目中使用PegDown markdown渲染器,通过视图帮助器函数渲染大量标记的片段。Play Framework 2 - 视图辅助函数的线程安全性
由于创建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)
}
虽然这可能被视为不成熟的优化,我很想知道是否需要threadlocal方法,或者在Play框架本身(或Scala)中是否有一些保护措施可以使它变得多余。
或者,就此而言,如果有更好的替代方法。
谢谢,这看起来像一个很好的工具!我主要对Play的视图渲染中的线程更广泛的问题感兴趣,所以我将暂时将其打开,但感谢您的意见。 – Mikesname