Ray Workflows创建虚拟actor或运行工作流报错This event loop is already running
报错原因
该RuntimeError: This event loop is already running报错的核心是Ray Workflows的原生同步API(包括get_or_create、workflow.run等)内部会默认尝试启动一个全新的asyncio事件循环执行逻辑,如果你当前的运行环境已经存在正在运行的事件循环,二者就会发生冲突。
这种场景绝大多数出现在Jupyter Notebook、IPython这类自带运行时事件循环的交互式环境,也可能出现在你自己的代码已经手动启动了事件循环的场景。
可行解决方案
- 方案1:替换为异步API调用
将同步的get_or_create方法替换为异步版本get_or_create_async,将业务逻辑包裹在异步函数中执行,示例代码如下:
import asyncio from ray import workflow @workflow.virtual_actor class ContextNode: def __init__(self): self.context = {} def put(self, key, value): self.context[key] = value @workflow.virtual_actor.readonly def get(self, key): return self.context[key] workflow.init() async def main(): context = await ContextNode.get_or_create_async('context') # 此处可继续执行后续业务逻辑 print("虚拟actor初始化完成") if __name__ == "__main__": asyncio.run(main())
- 方案2:兼容已有事件循环(适用于Jupyter等交互式环境调试场景)
安装nest_asyncio库,开启事件循环嵌套支持,无需修改原有Ray业务代码,仅需要在调用Ray Workflows API前执行以下代码即可:
import nest_asyncio nest_asyncio.apply()
- 方案3:调整脚本执行逻辑
如果是在普通Python脚本运行时触发该报错,检查你自己的代码是否提前启动了事件循环,要么将Ray Workflows的逻辑移到事件循环外执行,要么统一使用异步API在同一个事件循环内完成所有调用。
内容的提问来源于stack exchange,提问作者HashBr0wn
相关产品推荐
相关产品推荐

