Метод сна ZIO scala, не отключающий поток, по сравнению с использованием непосредственно потока.сон

#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 , но, вероятно, я делаю это неправильно. Ваше предложение приветствуется. Я добавил раздел кода выше.