【问题标题】:Could I use Akka to start background work (Future)我可以使用 Akka 开始后台工作吗(未来)
【发布时间】:2015-08-12 22:52:23
【问题描述】:

使用 Akka 作为后台 Worker 好用吗?

就像我想在数据库中插入一些查询,然后向我的用户返回一些东西,但在我想安排一个任务之前,该任务还应该将数据索引到另一个不需要回调的数据库中。

例子:

class Worker extends Actor {
    override def receive = {
         case t: Task => 
             Future {
                // do some long running work, which shouldn't affect a user
             }
      }
}

这行得通吗? 如果我一次发送多个任务会发生什么?它会立即开始运行它们,还是 Actor 会等到 Future 成功?

编辑:另外我会定义另一种情况,例如 case r: Reindex => 应该重新索引所有对象,有没有办法锁定它,以便它一次只运行一个重新索引? (特别是如果我有不止一台服务器)

【问题讨论】:

    标签: scala akka


    【解决方案1】:

    它会起作用,但是如果这个长时间运行的工作真的很长并且阻塞,你可以考虑在不同的执行上下文中运行它。

    Actor 不会等到 future 成功,但是当你的 Actor 正在使用的执行上下文/调度程序的所有线程都被这些长时间运行的任务阻塞时,你可能会遇到这种情况。

    阅读更多: http://doc.akka.io/docs/akka/snapshot/scala/dispatchers.htmlhttp://docs.scala-lang.org/overviews/core/futures.html

    关于重新索引:

    如果只有这个参与者负责重新索引,您可以只保留一些状态变量,告诉您当前是否正在进行重新索引。

    关于服务器间的同步不能告诉你太多。想到的天真的方法是在数据库中存储一些标志,可以从所有服务器访问。

    【讨论】:

    • 那么当我创建一个 Akka 调度程序时,它会为 scala Futures 创建一个执行上下文?我是否还需要以任何方式启动未来,或者如果我不调用任何函数,未来是否会运行?只是未来{println("Hello World!") }
    • 1.简化 - 是的。 2. 你不需要显式启动它。你可以在你的 REPL 中尝试一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    相关资源
    最近更新 更多