本文介绍一种基于 ray 线程化 actor(threaded actors)的轻量级方案,通过设置 `max_concurrency` 实现单个 actor 内部方法的并发调用,使数据生成与获取互不阻塞,无需外部队列或复杂引用管理。
在 Ray 分布式应用中,常需多个 Worker 并行生成数据,并由主驱动线程(driver)持续消费。一个典型误区是试图引入跨进程共享队列(如 multiprocessing.Queue 或 Redis),但这在 Ray 中既不必要也不推荐——它破坏了 Actor 封装性,还引入额外序列化、网络和同步开销。
更优雅且符合 Ray 设计哲学的解法是:利用 Actor 的线程化能力(max_concurrency)实现内部并发。默认情况下,Ray Actor 是单线程顺序执行的:若一个方法(如 generate())进入无限循环,其他方法(如 pop_data())将永远无法被调度。而启用 max_concurrency > 1 后,Actor 可在同一实例内并发执行多个远程方法调用,从而让“后台生成”与“前台拉取”真正并行。
以下是完整可运行的实践方案: