在线程中运行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
相关产品推荐
相关产品推荐

