【问题标题】:Read multiple web sockets at the same time and plot data in Python同时读取多个 Web 套接字并在 Python 中绘制数据
【发布时间】:2018-05-29 08:00:02
【问题描述】:

我对一般的脚本编写相当陌生,我很确定这是微不足道的,但我似乎找不到解决方案。我想使用 python websockets 库来监听多个 websocket,以便获取有关加密价格的股票信息。

How to get real time bid / ask / price from GDAX websocket feed 为获取一种货币的提要提供了良好的开端。

问题是 run_forever() 不允许我同时显示两个提要,因为我无法中断它。

【问题讨论】:

    标签: python websocket


    【解决方案1】:

    GDAX websocket 允许您订阅多对。 如下所示,我订阅了 BTC-USDETH-USD 对。我假设您可以订阅无限对。

    import websocket
    from json import dumps, loads
    try:
        import thread
    except ImportError:
        import _thread as thread
    
    def on_message(ws, message):
        parsed_msg = loads(message)
        print(parsed_msg["product_id"], parsed_msg["price"])
    
    def on_open(ws):
        def run(*args):
            params = {
                "type": "subscribe",
                "channels": [{"name": "ticker", "product_ids": ["BTC-USD", "ETH-USD"]}]
            }
            ws.send(dumps(params))
        thread.start_new_thread(run, ())
    
    if __name__ == "__main__":
        websocket.enableTrace(True)
        ws = websocket.WebSocketApp("wss://ws-feed.gdax.com", on_open=on_open, on_message = on_message)
        ws.run_forever()
    

    如果出于某种原因 GDAX 不允许这样做,您可以在多个线程中打开多个 Web 套接字,但在这种情况下它不是必需的。

    【讨论】:

    • 点赞!所以只是一个简单的问题,如果你不介意回答,上面的解决方案非常适合说 GDAX,但是如果你有多个交换,你会在不同的线程中运行它们吗?如果您有任何机会熟悉节点,那么如果我们只有一个正在运行事件循环的进程,您将如何做到这一点
    • 你可以,但是更好的解决方案,特别是如果你发现自己处理许多连接,那就是使用带有 asyncio 的事件循环。正如你所说,Nodejs 默认使用事件循环,所以它更容易。你可以使用这个库来处理 websockets:github.com/websockets/ws。事件循环旨在使用单个线程处理 1000 个请求。是的,如果两个打开的套接字在完全相同的时刻接收数据,它们将不会被并行处理。一次会先于另一次发生,但这是故意的。我可以更详细一点,但我的字符已经用完了,哈哈。
    • 非常感谢!我担心的是,如果您说有 10 个连接到不同的交易所,并且它们每秒都流式传输 100000 个项目,那么 asyncio 在某些时候也会成为瓶颈,所以如果 asyncio 可以以多线程方式运行,或者如果节点 websocket 或 socketio 库可以在多个进程上运行我认为这可能是相当长一段时间内一个不错的解决方案,我找不到任何关于这是否可能的信息,因此评论:)
    • 是的,当人们使用集群时,他们正在分叉主节点进程。因此,对于 8 个内核,您将有 8 个相同的进程处理请求,这应该会大致增加服务器每秒可以处理的请求数量 x8。但是对于您的情况,它不会起作用,尽管在技术上可能让每个进程运行不同的代码并连接到不同的套接字,但您绝对不应该这样做,这听起来像是一个很大的反模式。
    • 你应该能够在同一个线程中打开多个套接字连接,我认为它应该足够快,只要你不在你的回调函数中做任何缓慢的阻塞计算,比如加密,同步文件I/O 等。如果您可以尝试并回复我,我很想看看它是如何进行的,因为我以前没有亲自做过这样的事情。另外,也许我们应该拿这个来聊天?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 2011-10-30
    • 2014-08-25
    • 1970-01-01
    相关资源
    最近更新 更多