Параллельные коллекции scala: идиоматический способ иметь локальные переменные потока для рабочих потоков
Функция прогресса ниже - моя рабочая функция. Мне нужно дать ему доступ к некоторым классам, которые дорого создавать / приобретать. Есть ли какой-нибудь стандартный механизм для локальных переменных потока в библиотеках для этого? Или мне придется самому написать менеджер пула объектов?
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)
}