首页 文章

来自tinkergraph的多线程阅读

提问于
浏览
2

当尝试从一个tinkergraph多线程读取时,我的行为变得非常奇怪 . 我有以下情况:

Graph graph = TinkerGraph.open();
Set<Vertex> verticesAdded = randomGraph(graph);

verticesAdded 是我在 randomGraph(graph) 过程中添加的一组顶点 . 一旦我有这个列表,我检查这个顶点的内部属性,并根据该属性我将顶点传递给一个线程进行一些额外的工作 . 我遵循的过程大致是:

public class ValidateVerticies(){
    private Set<Vertex> vertices;
    private ExecutorService executor;
    public ValidateVerticies(Set<Vertex> verticesAdded){
        vertices = verticesAdded;
        executor = Executors.newSingleThreadExecutor(); //Single just for testing purposes
    }

    public validate(){
        for(Vertex vertex: vertices){
            String prop = vertex.property("type");
            if(type.equals("1"))
                executor.submit(() -> validateRule1(vertex))
            else if(type.equals("2"))
                executor.submit(() -> validateRule2(vertex))
            else if(type.equals("n"))
                executor.submit(() -> validateRule3(vertex))
            ...
            else if(type.equals("n"))
                executor.submit(() -> validateRulen(vertex))
        }
    }
}

上面的代码完全是单线程的,但是一旦我介绍了线程池,我就会遇到各种各样的错误 . 包含:

  • 顶点属性 "type" 不存在 .

  • java.lang.IndexOutOfBoundsException: Index: 0, Size: -1 尝试访问某些顶点属性时 .

  • 验证规则在最初通过时失败 .

从tinkergraph进行多线程读取时有什么微妙的东西吗?

Edit:

我将尝试简化问题:以下工作:

public class ValidateVerticies(){
    private Set<Vertex> vertices;
    public ValidateVerticies(Set<Vertex> verticesAdded){
        vertices = verticesAdded;
    }

    public validate(){
        for(Vertex vertex: vertices){
            String prop = vertex.property("type");
            if(type.equals("1"))
                validateRule1(vertex);
            ...
            else if(type.equals("n"))
                validateRulen(vertex);
        }
    }
}

虽然上面的多线程版本失败并且TinkerGraph(同样适用于支持事务的Titan)在从图形中读取时返回不一致的结果 .

1 回答

  • 0

    试一试 . 更换

    String prop = vertex.property("type");
    

    有了这个

    String type = vertex.value("type");
    

    前者返回 VertexProperty ,而后者返回VertexProperty的 value ,这是我认为你正在寻找的 .

    至于你的#2和#3子弹,你需要提供更多细节 .

相关问题