Wenn Steemit-Bots abstürzen... Meine Lösung!

Steemit-Bots

Mein Problem waren nach dem HF20 die häufigen Aussetzer der API-Nodes, weshalb die Bots und Programme, die ich davor geschrieben habe, nicht mehr zuverlässig funktionieren. Da ich irgendwie immer Probleme habe, Lösungen im Internet zu finden, habe ich jetzt doch eine Weile dafür gebraucht, sie selbst zu finden.
Immer wenn ich eine längere Zeit von der Blockchain mittels Python lese, tritt das Problem zufälligerweise auf.

from beem.blockchain import Blockchain

b = Blockchain()

def loop():
    for op in b.stream(opNames=['transfer']):
        print(op)

if __name__ == '__main__':
    loop()

Das ist der Grundaufbau, wie ich ihn immer benutzt habe. Er läuft, solang die Nodes antworten. Wenn eine Node einen Timeout verursacht, wechselt die Beem-API zu einer anderen Node. Sobald aber zwei Nodes aufeinanderfolgend versagen, gibt es eine Fehlermeldung und das Programm stürzt ab.

from beem.blockchain import Blockchain

b = Blockchain()

def loop():
    for op in b.stream(opNames=['transfer']):
        print(op)

if __name__ == '__main__':
    while True:
        try:
            loop()
        except Exception:
            pass  # ignorieren oder eine Fehlermeldung ausgeben

Das wäre meine "Lösung" wenn der Code in der loop() versagt, wird er automatisch neu gestartet. Das geht so einfach, wenn man Votingbots wie den @germanbot hat, bei denen nichts über Abstürze hinweg speichern muss. Wenn ich allerdings mal @steem-chain-info nehme, muss die ganze Zeit über gezählt werden und die Werte dürfen auf keinen Fall verloren gehen. Mit diesem Aufbau

from beem.blockchain import Blockchain

b = Blockchain()

def loop():
    werte = {'blocks': 0}
    for op in b.stream(opNames=['transfer']):
        werte['blocks'] += 1

if __name__ == '__main__':
    while True:
        try:
            loop()
        except Exception:
            pass  # ignorieren oder eine Fehlermeldung ausgeben

ist das nicht möglich. Mit einer kleinen Anpassung jedoch schon.

from beem.blockchain import Blockchain

b = Blockchain()
werte = {'blocks': 0}

def loop():
    global werte
    for op in b.stream(opNames=['transfer']):
        werte['blocks'] += 1

if __name__ == '__main__':
    while True:
        try:
            loop()
        except Exception:
            pass  # ignorieren oder eine Fehlermeldung ausgeben

Also werde ich jetzt alle Bots mal umschreiben und dann funktionieren sie hoffentlich wieder zuverlässig.


Anmerkung des Autors: Also hey, der Post bring wohl keine neuen Erkenntnisse, aber ich habe etwas geschrieben. Und das ist ja das, was ich will. Schreiben.
Das ist jetzt so ein bisschen wie ein Tagebucheintrag xD

H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now
Logo
Center