我面临的问题是,我试图从单个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)
答案 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是您希望其超时的时间(以秒为单位)。