【ray框架】ray 异步并发

异步并发

import ray
import time

@ray.remote(max_concurrency=1)
class timeSleep():
    def __init__(self, id):
        self.id = id

    def sleep(self, t):
        for i in range(t):
            time.sleep(1)
            print("id:", self.id)
        return t

if __name__ == '__main__':
    ts_list = [timeSleep.remote(i) for i in range(3)]
    trainers = {}
    for i, runner in enumerate(ts_list):
        trainers[runner.sleep.remote(i+5)] = runner

    st = time.time()
    for i in range(10000):
        print("循环用时: ", time.time() - st)
        st = time.time()
        print("循环开始时间: ", st)
        ready_runner_list, _ = ray.wait(list(trainers))
        ready_id = ready_runner_list[0]
        t = ray.get(ready_id)
        runner = trainers.pop(ready_id)
        for i in range(3):
            time.sleep(1)
            print("主程序")
        trainers[runner.sleep.remote(t)] = runner ## 每次要重新调用一下actor的方法才行。同一个task id只能被执行一次。
        st2 = time.time()
        print("新的task id: ", runner.sleep.remote(t))
        print("循环结束时间: ", st2)
  • 以上代码可以异步并发,也就是说trainers里面的多个进程可以异步进行,且和主程序是并发的。也就是在一定情况下 主程序可以一直在执行。
  • 这里要注意的是每次需要新建一个runner.sleep.remote(t),因为在ray里面一个task id只可以执行一次。所以当一个runner.sleep.remote(t)执行完以后,需要重新建一个。

比如:

一个task_ref 只会被执行一次

task_ref = ts_list[0].sleep.remote(3)
for i in range(10):
    ray.get(task_ref)

下面这个就可以执行多次。可以看到每次的task个id都是不一样的。

for i in range(10):
    task_ref = ts_list[0].sleep.remote(3)
    print(task_ref)
    ray.get(task_ref)

同一actor的并发情况

假设max_concurrency=1。

import ray
import time
import numpy as np

@ray.remote(max_concurrency=1)
class timeSleep():
    def __init__(self):
        self.i = 0

    def sleep(self, t):
        print("s1")
        time.sleep(t)
        # return t

    def sleep2(self, t):
        print("s2")
        time.sleep(t)
        
if __name__ == '__main__':
    ray.init()
    assert ray.is_initialized()
    ts = timeSleep.remote()
    ray.get([ts.sleep.remote(10), ts.sleep2.remote(5)]) ## 一个actor 同一时刻只有一个方法在运行
  • 上面这个case可以看到,即使是并发同一个actor里面的两个不同的方法,但是同一时刻也只会有一个task被执行。
  • 同一方法肯定也是。
课程介绍:本课程旨在介绍Python Ray框架的基本概念、核心组件和应用,帮助学员理解并掌握Ray在分布式计算领域的应用,并在实际工作和生活中获得职业加成和思维提升。教学设计:本课程采用系统化的教学设计,结合理论讲解和实际案例演示,以帮助学员全面理解Ray的工作原理和核心特性。课程内容根据逻辑顺序进行组织,从基础概念到高级应用,循序渐进地引导学员掌握Ray的使用技巧和最佳实践。内容特色:重点介绍Ray的任务并行模型、对象存储和Actor模型,让学员理解并运用这些特性进行高效的分布式计算。强调实际应用案例,展示Ray在分布式机器学习、强化学习、推荐系统等领域的成功应用,激发学员的创造力和应用思维。讲解方式:课程讲解采用简洁明了的语言,结合图示和示例代码,帮助学员轻松理解和掌握Ray的概念和使用方法。通过实际案例演示,学员可以看到Ray在实际项目中的应用场景和效果,进一步加深理解。与其他同类课程的差异化:本课程专注于Python Ray框架的介绍和应用,注重深入讲解任务并行、对象存储和Actor模型等核心概念。通过实际案例和应用场景的讲解,将Ray的理论知识与实际应用相结合,帮助学员将所学知识应用到实际工作和生活中。课程收益:     参与本课程后,学员将获得以下收益:职业加成:掌握Ray的分布式计算能力,提升在职场上解决复杂问题和处理大规模数据的能力。思维提升:理解任务并行、对象存储和Actor模型的思维模式,培养分布式思维和并发编程的能力。实际应用:通过实际案例演示和练习,学员将能够将Ray应用于实际工作项目中,提高工作效率和解决问题的能力。通过本课程的学习,您将掌握Python Ray框架的核心概念和应用,获得在分布式计算领域的专业知识,以及在实际工作和生活中获得的职业加成和思维提升。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值