J'ai un programme scala qui s'exécute pendant un certain temps puis se termine. Je voudrais fournir une bibliothèque à ce programme qui, dans les coulisses, programme une tâche asynchrone pour exécuter chaque N
secondes. Je voudrais aussi que le programme se termine lorsque le travail de main
entrypoint est terminé sans avoir besoin de dire explicitement au travail d'arrière-plan de s'arrêter (puisqu'il se trouve dans une bibliothèque). Comme le mieux que je peux dire la façon idiomatique d'effectuer un sondage ou un travail programmé dans Scala est avec ActorSystem.scheduler.schedule
d'Akka, mais en utilisant un ActorSystem, le programme se bloque après main
en attendant les acteurs. J'ai ensuite essayé et échoué à ajouter un autre acteur que join
s sur le fil principal, apparemment parce que "Anything that blocks a thread is not advised within Akka"Planification idiomatique du travail en arrière-plan qui disparaît avec le thread principal dans Scala
Je pourrais introduire un répartiteur personnalisé; Je pourrais mélanger quelque chose ensemble avec un sondage isAlive
, ou en ajoutant un contrôle similaire à l'intérieur de chaque travailleur; ou je pourrais abandonner sur Akka et juste utiliser des Threads bruts. Cela ressemble à une chose pas trop inhabituelle à vouloir faire, donc je voudrais utiliser Scala idiomatique s'il y a une meilleure façon claire.
Vous pouvez simplement bloquer le thread principal en utilisant 'Await.result (whenTerminated, Duration.Inf)' et déclencher la terminaison du système de l'acteur si nécessaire. –