好的,
我的情况是这样的:自从我被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'
答案 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)
}