#multithreading #scala #concurrency #zio
Вопрос:
В моем существующем коде Scala я заменил Thread.sleep(10000)
ZIO.sleep(Duration.fromScala(10.seconds))
с пониманием того, что он не будет блокировать поток из пула потоков (проблема с производительностью). Когда программа запускается, она не ждет в этой строке (хотя, конечно, в первом случае это так). Нужно ли мне добавлять какой-либо дополнительный код для работы метода ZIO ?
Добавление раздела кода из Play код Scala:
def sendMultipartEmail = Action.async(parse.multipartFormData) { request =>
.....
//inside this controller below method is called
def retryEmailOnFail(pList: ListBuffer[JsObject], content: String) = {
if (!sendAndGetStatus(pList, content)) {
println("<--- email sending failed - retry once after a delay")
ZIO.sleep(Duration.fromScala(10.seconds))
println("<--- retrying email sending after a delay")
finalStatus = finalStatus amp;amp; sendAndGetStatus(pList, content)
} else {
finalStatus = finalStatus amp;amp; true
}
}
.....
}
Комментарии:
1. Можете ли вы поделиться всем кодом целиком?
2.Вы не поняли, что ZIO ничего не делает, это просто описание программы; она не запускается. И если вы запустите его там, он заблокирует поток. Вы просто не можете просто поместить ZIO (или любую другую
IO
монаду) в кодовую базу, которая не была разработана для использования с ними, и получить ее преимущества из коробки.
Ответ №1:
Как вы сказали, ZIO.sleep
будет приостановлено только запущенное волокно, а не поток операционной системы.
Если вы хотите начать что-то после сна, вам следует просто связать это после сна:
// value 42 will only be computed after waiting for 10s
val io = ZIO.sleep(Duration.fromScala(10.seconds)).map(_ => 42)
Комментарии:
1. Я попытался добавить
map
, но, вероятно, я делаю это неправильно. Ваше предложение приветствуется. Я добавил раздел кода выше.