Sleeping actors?

前端 未结 4 1005
面向向阳花
面向向阳花 2021-01-31 20:44

What\'s the best way to have an actor sleep? I have actors set up as agents which want to maintain different parts of a database (including getting data from external sources).

4条回答
  •  梦毁少年i
    2021-01-31 21:26

    There's no need to explicitly cause an actor to sleep: using loop and react for each actor means that the underlying thread pool will have waiting threads whilst there are no messages for the actors to process.

    In the case that you want to schedule events for your actors to process, this is pretty easy using a single-threaded scheduler from the java.util.concurrent utilities:

    object Scheduler {
      import java.util.concurrent.Executors
      import scala.compat.Platform
      import java.util.concurrent.TimeUnit
      private lazy val sched = Executors.newSingleThreadScheduledExecutor();
      def schedule(f: => Unit, time: Long) {
        sched.schedule(new Runnable {
          def run = f
        }, time , TimeUnit.MILLISECONDS);
      }
    }
    

    You could extend this to take periodic tasks and it might be used thus:

    val execTime = //...  
    Scheduler.schedule( { Actor.actor { target ! message }; () }, execTime)
    

    Your target actor will then simply need to implement an appropriate react loop to process the given message. There is no need for you to have any actor sleep.

提交回复
热议问题