gpt4 book ai didi

scala - 如何与 Actor 一起使用 Tinkerpop

转载 作者:行者123 更新时间:2023-12-04 17:09:57 26 4
gpt4 key购买 nike

我想知道我是否可以在 Akka Futures 中使用 tinkerpop,到目前为止,当我将更改提交到图表时,它们不会被持久化。
我知道 tinkerpop 是一个线程本地库,这意味着我需要在 future 再次设置我的线程 ODatabaseRecordThreadLocal.INSTANCE.set(thread)
我尝试了以下方法但没有成功:

def test[T](graphChanges: => T): T = {
val thread = ODatabaseRecordThreadLocal.INSTANCE.get
try graphChanges finally {
ODatabaseRecordThreadLocal.INSTANCE.set(thread)
GraphPool.get("partitioned").commit
}
}

// collect tinkerpop frames
test {
future {
// add changes to my tinkerpop frames
}
}

我想在每个 play.mvc.Http.Context 上使用 Tinkerpop 线程

这是我想要实现的示例项目: https://github.com/D-Roch/tinkerpop-play

最佳答案

问题

问题是,Tinkerpop 在本地工作线程。因此,您的更改仅提交给当前线程。在创建 Scala future 时,您让环境选择 future 将在哪个线程中执行。而且环境不知道更好,所以它选择了错误的线程。

Akka future 的问题与此类似。

future 在哪个线程中运行?

创建 future 时,您使用两个参数创建它:

  • 应该执行的块
  • Execution Context应该执行块

  • 第二个参数通常作为隐式参数给出。但是您可以覆盖默认值。

    解决方案

    创建处理 Tinkerpop 的 future 时,请使用在同一线程中运行每个块的执行上下文。

    例子:
    import scala.concurrent.ExecutionContext
    import java.util.concurrent.Executors

    implicit val ec=ExecutionContext.fromExecutorService(Executors.newSingleThreadExecutor)

    future {
    println(Thread.currentThread);
    future {
    println(Thread.currentThread)
    }
    }

    此代码在控制台上两次打印出相同的线程 ID(使用 Java 7 和 Scala 2.10.2 测试。

    注意:使用这么小的线程池很容易导致死锁或饥饿。仅将其用于 Tinkerpop 互动。

    您可以提供一个特殊的方法 tinkerpopFuture,它将块作为参数并返回将在 tinkerpop 线程中运行的 future 。或者您可以创建一个特殊的 actor,它封装了所有 tinkerpop 交互(并使用特殊的 tinkerpop 执行上下文运行它们)。

    文学
  • 您可以看到一些用于创建执行上下文的示例代码 here .
  • Akka Futures and execution contexts 的文档
  • 关于scala - 如何与 Actor 一起使用 Tinkerpop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20885935/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com