2013-12-12 103 views
1

我很想知道线程安全性需要在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)中是否有一些保护措施可以使它变得多余。

或者,就此而言,如果有更好的替代方法。

回答

1

我不熟悉PegDown或Play框架,所以我无法解决您的问题的部分。

但是,如果您可以在项目中使用C库,MultiMarkdown 4是线程安全和高性能的,并且可能是一种有用的替代方法。我在MultiMarkdown Composer中使用它,它可以有多个解析器实例同时运行,用于不同目的而不会发生冲突。

https://github.com/fletcher/MultiMarkdown-4/

http://fletcherpenney.net/multimarkdown/

+0

谢谢,这看起来像一个很好的工具!我主要对Play的视图渲染中的线程更广泛的问题感兴趣,所以我将暂时将其打开,但感谢您的意见。 – Mikesname