如何与演员一起使用Tinkerpop

  发布于 2023-02-07 07:10

我想知道我是否可以在Akka Futures中使用tinkerpop,到目前为止,当我对图表进行更改时,它们不会被持久化.我知道tinkerpop是一个线程本地库,这意味着我需要在将来再次设置我的线程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

1 个回答
  • 问题

    问题是,Tinkerpop工作线程本地.因此,您的更改仅提交给当前线程.在创建Scala期货时,您让环境选择,在哪个线程中执行未来.并且环境不是更好,所以它选择了错误的线程.

    Akka期货的问题类似.

    未来在哪个线程中运行?

    创建未来时,您将使用两个参数创建它:

      应该执行的块

      应执行块的执行上下文

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

    在创建处理Tinkerpop的期货时,使用执行上下文来运行同一线程中的每个块.

    例:

    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线程中运行的未来.或者你可以创建一个特殊的actor来封装所有的tinkerpop交互(并使用特殊的tinkerpop exection上下文来运行它们).

    文献

    您可以在此处查看用于创建执行上下文的示例代码.

    Akka期货和执行环境的文档

    2023-02-07 07:25 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有