2013-12-22 6 views
2

아래의 진행률 함수는 내 작업자 함수입니다. 생성/획득하는 데 비용이 많이 드는 클래스에 액세스 할 수 있어야합니다. 이 라이브러리에 대한 스레드 로컬 변수에 대한 표준 기계가 있습니까? 또는 객체 풀 관리자를 직접 작성해야합니까?스칼라 병렬 컬렉션 : 작업자 스레드에 스레드 로컬 변수가있는 관용적 방법

object Start extends App { 
    def progress { 
     val current = counter.getAndIncrement 
     if(current % 100 == 0) { 
      val perc = current.toFloat * 100/totalPosts 
      print(f"\r$perc%4.2f%%") 
     } 
    } 

    val lexicon = new Global() 

    def processTopic(forumId: Int, topicId: Int) { 
     val(topic, posts) = ProcessingQueries.getTopicAndPosts(forumId,topicId) 

     progress 
    } 



    val (fid, tl) = ProcessingQueries.getAllTopics("hon") 
    val totalPosts = tl.size 
    val counter = new AtomicInteger(0) 
    val par = tl.par 

    par.foreach { topic_id => 
     processTopic(fid,topic_id) 
    } 
} 

답변

1

이전 답을 대체했습니다. 이것은 트릭을 멋지고 깔끔하게합니다.

object MyAnnotator extends ThreadLocal[StanfordCoreNLP] { 
    val props = new Properties() 
    props.put("annotators", "tokenize,ssplit,pos,lemma,parse") 
    props.put("ssplit.newlineIsSentenceBreak", "two") 
    props.put("parse.maxlen", "40") 

    override def initialValue = new StanfordCoreNLP(props) 
    } 
+2

ThreadLocal에서 initialValue를 재정 의하여 더 정돈 할 수 있습니다. 그렇게하면 get/set 논리를 수행 할 필요가 없습니다. –