2016-09-19 3 views
0

Okay, sogoroutine Deadlock: In einer Anwendung, die von einem blockchain liest und schreibt zu rethinkdb, haben

Meine Situation ist dies: Es ist drei Wochen her, und einige ungerade Stunden, da ich von rissen geworden bin Golang. Ich arbeite an einem Blockchain-Dump-Tool für Steem, und ich werde github.com/go-steem/rpc, der Bibliothek, auf die ich mich momentan verlasse, einen Hauch von gjson geben. Nun, mit dieser Frage geht es um die Goroutines für meinen aktuellen Blockchain-Leser. Hier ist es (leider ein bisschen auf der bulligen Seite, aber Sie werden den Teil zu sehen, dass ich wieder in die Bibliothek ziehen will, auch):

// 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) 
} 

ich nur ein Drittel bearbeiten angeschnitten, das war um die Funktion writeBlock von goroutine getBlock aufzurufen, anstatt wie früher. Ich '

+1

Es würde helfen, wenn Sie das isolieren könnte Ausgabe und Erstellung eines reproduzierbaren Snippets (noch besser wäre ein Test) ohne Verbindung zu verschiedenen Ressourcen (zB Datenbank). Mir ist auch nicht klar, um welches Problem es sich handelt. Tritt ein bestimmter Fehler auf (d. H. Deadlock)? Wenn ja, können Sie den Fehler posten? – themihai

+0

Hm. Also, nein, ich weiß nicht-- Ich wusste nicht, dass Deadlock einen Fehler zurückgibt. Und, Sie haben es, lassen Sie mich auf diesen Codeblock einige hämmern, um die Verschrobenheit zu isolieren. Danke! –

+0

In 5 Minuten oder so werde ich eine "Schnitt auf den Knochen (keine Blockaw) Version des gleichen Codes. Danke. –

Antwort

0

Okay, so ist das jetzt gelöst, aber das wird eine weitere Frage, leider.

Ich habe die Anwendung mit der Goroutine arbeiten, aber es hat keine Leistung erhöht.

Die Art und Weise, dass ich es an die Arbeit bekam, war durch keine goroutine von einem goroutine Laichen und stattdessen eine einfache Funktion aufrufen, Schreibblock aus der goroutine „getblock“:

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) 
} 
Verwandte Themen