2016-08-21 18 views
1

Poloniex APIからデータを取得しています。ウェブソケットAPIを使用しています。私はAutoBahn Python websocket libraryを使用しています。オートバンを使用してwebsocketに再接続する

現在、次のコードを使用して、チケットデータが利用可能になった時点で印刷しています。これはうまくいきますが、長期間ではありません。毎回12〜36時間ごとに出力が停止します(Poloniexがサーバーを再起動したときに思っています)。

ApplicationRunnerがまだ接続されているかどうかを確認し、接続が解除された場合は再起動する方法はありますか? onDisconnectはトリガーしていません。スクリプトを実行すると、ソケットがデータの受信を停止したときにプロセスが終了しないので、イベントループが停止したとは思わない。

from autobahn.asyncio.wamp import ApplicationSession 
from autobahn.asyncio.wamp import ApplicationRunner 
from asyncio import coroutine 
import asyncio 
from datetime import datetime 

class PoloniexComponent(ApplicationSession): 
    def onConnect(self): 
     self.join(self.config.realm) 

    @coroutine 
    def onJoin(self, details): 
     def onTicker(*args): 
      print("{}: {}".format(datetime.utcnow(), str(args))) 
     try: 
      yield from self.subscribe(onTicker, 'ticker') 
     except Exception as e: 
      print("Could not subscribe to topic:", e) 

    def onDisconnect(self): 
     asyncio.get_event_loop().stop() 


def main(): 
    runner = ApplicationRunner("wss://api.poloniex.com:443", "realm1") 
    runner.run(PoloniexComponent) 

if __name__ == "__main__": 
    main() 
+0

ポロでの取引のためにwebsocket python3バージョンを共有するのはとても涼しいです:-)私はずっと前に、短く明確なバージョンを探していました。どうもありがとうございます –

答えて

0

のWebSocket接続は永続的であり、実際の通信を行わずに、基になる接続がを殺されたことを発見していない、必要はありません時にデータが送信されませんので、(何が起こるかであるPoloniexのWebSocketサーバーの再起動) - 少なくとも少なくとも素早く。

の切断に対して迅速かつ確定的に対応するには、サーバー側でWebSocketの自動pingを有効にする必要があります。 [source]

私は知っているが、ポロは、このオプションを有効化していないと仮定...

しかし、あなたはこのようなものを使用して、「自分」アクティブピングバージョンを構築することができません:

は別のものを作成します。 (runner_watcherという名前の)ApplicationRunnerインスタンスで、新しいトピックをサブスクライブしてインスタンスをクローズした後、N秒待ってからプロシージャを再起動します。

例外が発生したときあなたの "runner_watcher"インスタンスで "topic to subscribe")が呼び出された場合、あなたはおそらくrがダウンしているので、プライマリApplicationRunnerを強制的に停止し、サーバーが復帰したら(runner_watcherの実行中にExceptionが発生しなくなった場合は、サーバーが再起動してプライマリApplicationRunnerを再起動すると思われる)

Iこのアプローチが汚い(エレガントでない)ことに同意しますが、おそらく動作する可能性があります

オートバンで自動再接続がまだ実装されていませんで、現在作業中です。

関連する問題