You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Mock模块在Python中禁用Ray以进行调试与性能分析

实现Mock Ray类以无缝切换Ray与本地调试模式

核心实现思路

  • 模拟ray.remote装饰器,对被装饰的类进行包装,完全保留原类的方法逻辑
  • 为包装后的类添加.remote()方法,模拟Ray的实例化调用,直接返回原类的实例
  • 为类的每个方法添加.remote()方法:同步方法自动包装为异步函数,异步方法直接透传调用,确保原有await语法完全兼容

完整RayMock实现代码

import asyncio
from functools import wraps

class RayMock:
    def remote(self, cls=None, **kwargs):
        # 兼容两种装饰器调用方式:@ray.remote 和 @ray.remote(num_cpus=2)
        if cls is None:
            return lambda cls: self.remote(cls, **kwargs)
        
        # 包装类,模拟Ray远程类的行为
        class MockRemoteClass:
            # 模拟Ray的实例化接口 .remote()
            @classmethod
            def remote(cls, *args, **kwargs):
                return cls(*args, **kwargs)
            
            def __init__(self, *args, **kwargs):
                # 初始化原类的真实实例
                self._original_instance = cls(*args, **kwargs)
                
                # 为每个公开方法添加.remote()包装
                for attr_name in dir(self._original_instance):
                    attr = getattr(self._original_instance, attr_name)
                    if callable(attr) and not attr_name.startswith('_'):
                        wrapped_method = self._wrap_method(attr)
                        setattr(self, f"{attr_name}.remote", wrapped_method)
            
            def _wrap_method(self, method):
                @wraps(method)
                async def wrapper(*args, **kwargs):
                    if asyncio.iscoroutinefunction(method):
                        # 原方法是异步的,直接调用并返回结果
                        return await method(*args, **kwargs)
                    else:
                        # 原方法是同步的,包装为异步执行以兼容await语法
                        return method(*args, **kwargs)
                return wrapper
        
        return MockRemoteClass

使用示例

1. 装饰业务类

# 替换原有的import ray为导入Mock类
from ray_mock import RayMock
ray = RayMock()

@ray.remote
class A:
    def method1(self):
        return 3
    
    async def method2(self, x):
        await asyncio.sleep(0.1)
        return x * 2

2. 业务代码完全无需修改

async def main():
    obj = A.remote()
    # 同步方法仍用await调用
    result1 = await obj.method1.remote()
    print(result1)  # 输出3
    
    # 异步方法逻辑完全保留
    result2 = await obj.method2.remote(5)
    print(result2)  # 输出10

asyncio.run(main())

无缝切换真实Ray与Mock

通过环境变量或配置开关实现一键切换,无需改动业务代码:

import os

# 根据环境变量选择Ray实现
if os.getenv("USE_MOCK_RAY", "False").lower() == "true":
    from ray_mock import RayMock
    ray = RayMock()
else:
    import ray
    ray.init()  # 初始化真实Ray集群

调试时设置USE_MOCK_RAY=true即可禁用Ray,使用本地模式;生产环境自动切换为真实Ray集群。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:05:12