goroutine deadlock:在一个从区块链中读取并写入rethinkdb的应用程序中

时间:2016-09-19 12:25:56

标签: go deadlock channel goroutine blockchain

好的,

我的情况是这样的:自从我被golang吸引后,已经过了三个星期和几个小时。我正在研究一个用于steem的区块链转储工具,我可能会给github.com/go-steem/rpc(我目前依赖的库)提供一些gjson。现在,有了这个说,这个问题是关于我现在的区块链阅读器的goroutines。这是(对不起有点强壮,但你会看到我想要回到图书馆的部分):

    // Keep processing incoming blocks forever.
    fmt.Println("---> Entering the block processing loop")
    for {
        // Get current properties.
        props, err := Client.Database.GetDynamicGlobalProperties()
        if err != nil {
            fmt.Println(err)
        }

        // Process blocks.
        for I := uint32(1); I <= props.LastIrreversibleBlockNum; I++ {
            go getblock(I, Client, Rsession)
        }
        if err != nil {
            fmt.Println(err)
        }

    }

}

func getblock(I uint32, Client *rpc.Client, Rsession *r.Session) {
    block, err := Client.Database.GetBlock(I)
    fmt.Println(I)
    writeBlock(block, Rsession)
    if err != nil {
        fmt.Println(err)
    }
}

func writeBlock(block *d.Block, Rsession *r.Session) {
    //rethinkdb writes
    r.Table("transactions").
        Insert(block.Transactions).
        Exec(Rsession)
    r.Table("blocks").
        Insert(block).
        Exec(Rsession)
}

我刚刚对此进行了第三次编辑,即从goroutine getBlock调用函数writeBlock,而不是之前我正在做的事情。 I'

1 个答案:

答案 0 :(得分:0)

好的,所以现在已经解决了,但这会产生另一个问题,不幸的是。

我已经让应用程序与goroutine一起工作,但它没有提高性能。

我让它工作的方式是不从goroutine产生goroutine而是调用一个普通的函数,来自goroutine“getblock”的writeBlock:

    fmt.Println("---> Entering the block processing loop")
    for {
        // Get current properties.
        props, err := Client.Database.GetDynamicGlobalProperties()
        if err != nil {
            fmt.Println(err)
        }

        // Process blocks.
        for I := uint32(1); I <= props.LastIrreversibleBlockNum; I++ {
            go getblock(I, Client, Rsession)
        }
        if err != nil {
            fmt.Println(err)
        }

    }

}

func getblock(I uint32, Client *rpc.Client, Rsession *r.Session) {
    block, err := Client.Database.GetBlock(I)
    fmt.Println(I)
    writeBlock(block, Rsession)
    if err != nil {
        fmt.Println(err)
    }
}

func writeBlock(block *d.Block, Rsession *r.Session) {
    //rethinkdb writes
    r.Table("transactions").
        Insert(block.Transactions).
        Exec(Rsession)
    r.Table("blocks").
        Insert(block).
        Exec(Rsession)
}