繁体   English   中英

使用AutoBahn重新连接到websocket

[英]Reconnecting to a websocket using AutoBahn

我通过使用他们的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。 [ 来源 ]

我不知道但是假设马球没有激活这个选项......

但是您可以使用以下内容构建“自己的”活动ping版本:

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

当您的“runner_watcher”实例引发异常(“无法订阅主题”)时,您可能会认为服务器已关闭...,因此您强制停止主ApplicationRunner以及服务器何时返回(不再在执行“runner_watcher”期间引发异常,您可能会认为服务器再次启动并重新启动主ApplicationRunner

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

2015年高速公路尚未实施自动重新连接,但目前正在进行中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM