首页 > 解决方案 > Binance 多线程套接字 - 不同时调用的函数

问题描述

我有一个代码可以从币安接收关于当前价格的数据:

import asyncio
from binance import AsyncClient, BinanceSocketManager
import time
from datetime import datetime


def analyze(res):
    kline = res['k']

    if kline['x']: #candle is compleated
        print('{} start_sleeping {} {}'.format(
            datetime.now(),
            kline['s'],
            datetime.fromtimestamp(kline['t'] / 1000),
        ))
        time.sleep(5)
        print('{} finish_sleeping {}'.format(datetime.now(), kline['s']))


async def open_binance_stream(symbol):
    client = await AsyncClient.create()
    bm = BinanceSocketManager(client)
    ts = bm.kline_socket(symbol)
    async with ts as tscm:
        while True:
            res = await tscm.recv()
            analyze(res)

    await client.close_connection()


async def main():
    t1 = asyncio.create_task(open_binance_stream('ETHBTC'))
    t2 = asyncio.create_task(open_binance_stream('XRPBTC'))
    await asyncio.gather(*[t1, t2])


if __name__ == "__main__":
    asyncio.run(main())

如何使analyze函数同时被调用。Binance 使用两个流数据(ETHBTC 和 XRPBTC)同时发送信息

但是只有在前一个(睡眠)完成后analyze才会调用函数。analyze

在此处输入图像描述

我希望函数analyze被立即独立地调用。

标签: pythonsocketsstreampython-asynciobinance

解决方案


您是否尝试将分析放在一个线程中。我认为它会达到你想要的。

import asyncio
from binance import AsyncClient, BinanceSocketManager
import time
from datetime import datetime
from threading import Thread

def analyze(res):
    kline = res['k']

    if kline['x']: #candle is compleated
        print('{} start_sleeping {} {}'.format(
            datetime.now(),
            kline['s'],
            datetime.fromtimestamp(kline['t'] / 1000),
        ))
        time.sleep(5)
        print('{} finish_sleeping {}'.format(datetime.now(), kline['s']))


async def open_binance_stream(symbol):
    client = await AsyncClient.create()
    bm = BinanceSocketManager(client)
    ts = bm.kline_socket(symbol)
    async with ts as tscm:
        while True:
            res = await tscm.recv()
            Thread(target= analyze, args = (res)).start()

    await client.close_connection()


async def main():
    t1 = asyncio.create_task(open_binance_stream('ETHBTC'))
    t2 = asyncio.create_task(open_binance_stream('XRPBTC'))
    await asyncio.gather(*[t1, t2])


if __name__ == "__main__":
    asyncio.run(main())

这应该按预期工作。


推荐阅读