Play Framework 2 - 视图助手功能的线程安全性

时间:2013-12-12 11:55:06

标签: multithreading scala thread-safety playframework-2.0

我很想知道在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,就此问题)是否有一些保护会使其变得多余。

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

1 个答案:

答案 0 :(得分:1)

我不熟悉PegDown或Play框架,因此我无法解决您问题的这一部分。

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

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

http://fletcherpenney.net/multimarkdown/