You need to enable JavaScript to run this app. 在线程中运行cryptofeed异步函数出现无事件循环错误如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

在线程中运行cryptofeed异步函数出现无事件循环错误如何解决?

问题原因
  • cryptofeed 是基于asyncio库开发的异步工具,Python主线程会默认初始化asyncio事件循环,但手动创建的独立子线程不会自动绑定事件循环,因此调用依赖异步运行环境的FeedHandler.run()方法时触发RuntimeError: There is no current event loop in thread报错。
解决方案

在子线程执行的func()函数开头,手动为当前线程创建并绑定asyncio事件循环即可解决问题,修改后的完整代码如下:

import functools as fct
from cryptofeed import FeedHandler
from cryptofeed.defines import BID, ASK, L2_BOOK
from cryptofeed.exchanges import Kraken
from datetime import datetime
import threading
import asyncio


async def bookfunc(params , orderbooks, feed, symbol, book, timestamp, receipt_timestamp):

    print(f'Timestamp: {timestamp} Cryptofeed Receipt: {receipt_timestamp} Feed: {feed} Symbol: {symbol}'
          f' Book Bid Size is {len(book[BID])} Ask Size is {len(book[ASK])}')
    orderbooks = filter_orderbook(orderbooks, book, symbol, params['orderbook']['depth'])


def func():
    # 为当前子线程手动创建并绑定asyncio事件循环
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)

    # Parameters
    params = {'orderbook': {'depth': 2}, 'price_model':{}, 'trade_model': {}}
    config = {'log': {'filename': 'logs/demo.log', 'level': 'INFO'}}

    orderbooks = {}

    f = FeedHandler(config=config)
    f.add_feed(Kraken(checksum_validation=True, subscription={L2_BOOK: ['BTC-USD', 'ETH-USD', 'LINK-USD', 'LTC-USD', 'ADA-USD']},
                      callbacks={L2_BOOK: fct.partial(bookfunc, params, orderbooks)})) # This way passes the orderbooks inside the callback

    f.run()


if __name__ == '__main__':
    thread = threading.Thread(target=func, args=())
    thread.start()
  • 注:代码中filter_orderbook为用户自定义函数,需自行实现,不影响本次报错的修复。

内容的提问来源于stack exchange,提问作者nunodsousa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 17:45:00