从WebSocket中提取数据的最快方法

时间:2018-01-17 04:09:23

标签: python performance sockets websocket io

我面临的问题是,我试图从单个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)

2 个答案:

答案 0 :(得分:1)

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

这将使您能够并行运行客户端,而无需触摸现有代码(太多)。您只需要管理Greenlets(各种线程,但更安全,更易于处理,并强烈建议进行IO操作)。

答案 1 :(得分:0)

除了以上引用gevent的答案:

唯一的阻塞将发生在接收端,您可以使用以下方法来克服这一点:

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

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