【问题标题】:Fastest way to pull data from a WebSocket从 WebSocket 提取数据的最快方法
【发布时间】:2018-06-25 21:10:33
【问题描述】:

我面临的问题是,我试图从单个 WebSocket 中提取小数据包中的高频数据,然后将其推送到我的 AWS Kinesis Steam 进行处理。我正在使用 Python v3.6。

目前我正在使用 pythons 同步 Web 套接字库 websocket-client,并且我在拉取和推送到我的 Stream 时没有问题。

将WebSockets 库用于异步套接字会更好吗?我担心WebSocket请求的循环结构中的阻塞可能是一个瓶颈。

while True:
    session = boto3.Session(aws_key, aws_secretkey)
    kinesis = session.client('kinesis', region_name='us-east-1')
    conn = ws.create_connection(url, sslopt={"cert_reqs": ssl.CERT_NONE})
    count = 0
    data = []
    try:
        while True:
            msg = json.dumps(json.loads(conn.recv())['data'])
            data.append({'Data':msg, 'PartitionKey':'trade'})
            count += 1
            if count == 100:
                kinesis.put_records(StreamName = 'Binance_Stream', Records = data)
                count = 0
                data = []
                print('100 msg posted')
    except (ws.WebSocketConnectionClosedException, SQLAlchemyError) as e:
        print('Connection Error: ' + e)

【问题讨论】:

    标签: python performance sockets websocket io


    【解决方案1】:

    以并行方式运行 websocket 客户端的最简单方法是利用 Python 库Gevent

    这将使您能够在不接触现有代码(太多)的情况下并行运行客户端。您只需要管理 Greenlets(一种线程,但更安全、更易于处理,强烈推荐用于 IO 操作)。

    【讨论】:

    • 谢谢。感谢您的提示。
    【解决方案2】:

    除了上面引用gevent的答案:

    唯一的阻塞将在接收时发生,您可以通过以下方式克服这个问题:

    wsock = request.environ.get('wsgi.websocket')
    with Timeout(2, False) as timeout:
        message = wsock.receive()
    

    2 是您希望它超时的时间(以秒为单位)。

    【讨论】:

      猜你喜欢
      • 2016-08-03
      • 2022-07-06
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 2023-01-26
      • 1970-01-01
      相关资源
      最近更新 更多