python使用ray框架改进原有代码,实现多进程与分布式

安装依赖:pip install -i https://mirrors.aliyun.com/pypi/simple/ 'ray[default]'

ray框架可以在几乎不改变现有代码的基础上实现分布式与并行计算!!改变的只有传值的方式,与每个函数加上装饰器即可

对于常规的循环任务

def exponentiation_test(a, b):
    import time
    time.sleep(1) # 这里是为了看是否是真正的多进程,卡一下时间
    value = a ** b ** 3
    return a, b


if __name__ == '__main__':
    for value in range(100):
        value += 3
        print(exponentiation_test(value, value // 2))

使用多进程改写

这是针对上面的for循环改写的多进程执行for循环的操作,非常简单

import ray

ray.init(num_cpus=3) # 步骤一:初始化


# import psutil
# ray.init(num_cpus=psutil.cpu_count(logical=False)) # 使用全部的CPU

@ray.remote # 步骤二:多进程的函数添加@
def exponentiation_test(a, b):
    import time
    time.sleep(1)
    value = a ** b ** 3
    print(a, b)
    return a, b


if __name__ == '__main__':
    remote_id_list = [] # 步骤三:使用一个列表保存每个任务的id
    for value in range(100):
        value += 3
        exp_id = exponentiation_test.remote(value, value // 2) # 这里就开始自动调度多进程了
        remote_id_list.append(exp_id) # 把任务列表添加到列表中
    print("wakakakakak....")  # 步骤四:当执行这一行代码的时候,@ray.remote的代码仍在异步执行,并且返回一个任务id,除非使用ray.get(任务id)才会使程序等待直到这个任务id执行完成
    z = ray.get(remote_id_list[-1])  # 程序运行到get时会等待这个任务id执行完成
    print(z)

参考文章

  • https://towardsdatascience.com/modern-parallel-and-distributed-python-a-quick-tutorial-on-ray-99f8d70369b8
  • https://docs.ray.io/en/latest/multiprocessing.html
  • 取代 Python 多进程!伯克利开源分布式框架 Ray

你可能感兴趣的:(python,python)