使用AutoBahn重新连接到websocket



我通过使用他们的websocket API从Poloniex API获取数据。我正在使用AutoBahn Python 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()

由于WebSocket连接是持久的,并且在没有需要的时候不会发送数据,如果没有实际的流量,则不会发现底层连接已被杀死(这是Poloniex WebSocket服务器重启时发生的情况)- 至少不会很快。

为了能够快速和确定地对断开作出反应,需要在服务器端启用WebSocket自动ping。[源]

我不知道,但假设polo没有激活这个选项…

但是你可以构建你"自己的"活动ping版本,像这样:

创建另一个ApplicationRunner实例(名为"runner_watcher"),尝试用它订阅一个新主题,当它完成后关闭实例,然后等待N秒并重新启动过程,等等。

当异常("Could not subscribe to topic")在你的"runner_watcher"实例上引发时,你可能会认为服务器宕机了…,所以你强制停止主ApplicationRunner,当服务器返回时(在执行"runner_watcher"期间不再引发异常),你可以假设服务器再次启动并重启主ApplicationRunner

我同意这种方法很脏(不优雅),但它可能有效

2015年autobahn 尚未实现自动重连,但目前正在进行中。

相关内容

  • 没有找到相关文章