如何在斯卡拉清理我死去的演员
你好
我使用 scala(2.8.1)来使用actor实现一个耗时的任务处理程序,但是,我在运行单元测试时无法清理它,所以我的单元测试永远挂起. 我怎么称呼方法是: val configs = new ProjectsConfig("XXXXXXXXXXXXX") try { configs.start configs.init//time consuming stuff } finally { configs.destory configs.stop } 我打算做的是保持actor的引用并在每个on上调用exit,代码片段如下: > init,初始化actor并保持每个actor的引用. 但是,似乎效果不佳.在这种情况下如何清理所有演员? class ProjectsConfig(val url: String) extends Actor { private var actors: List[Actor] = List() private object Stop def init = { val caller = this; for (projectConfig <- list) { val myActor: Actor = actor { caller ! projectConfig.instantiate } actors = actors ::: List(myActor) } } def act() { while (true) { receive { case project: Project => Projects.update(project) case Stop => exit() } } } def destory { for (actor <- actors) { try { actor ! exit } catch { case e => System.out.println(e.printStackTrace) } } } def stop() { this ! Stop } 解决方法
1)在你的具体情况下,我会简化
val myActor: Actor = actor { caller ! projectConfig.instantiate } 只是打电话! projectConfig.instantiate.您已经从演员的子系统拨打电话,因此不需要额外的换行. 除此之外,尽管通常建议从演员的环境中调用演员(产生调用),但它根本不是“必须”(如果你直接在非演员环境中调用演员,则不会发生任何恶意).在您的情况下,包装调用会增加问题(样板和不一致). 2)演员实际发生了什么!退出是演员! Actor.exit(assuming that you have a wildcard import on actor{ loop{ react{ case `exit => exit('stop) } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |