等到任务用 Python 中的 Ray 完成

Posted

技术标签:

【中文标题】等到任务用 Python 中的 Ray 完成【英文标题】:Wait until tasks are finished with Ray in Python 【发布时间】:2020-11-07 21:20:16 【问题描述】:

我有一个如下所示的脚本:

my_dict = 

@ray.remote
def f(n):
    # adds to my_dict after parsing through a 
    # large file that was split up into 8 sections;
    # each section is parsed in parallel using ray

tasks = [f.remote(i) for i in range(1,9)]
ray.get(tasks) 

with open('my_csv.csv', 'w+') as write_obj: 
    # write rows from my_dict keys & values 

为了使 my_csv.csv 看起来正确,任务必须完成添加到 my_dict。这些任务计算 my_csv 中的列并将它们添加到 my_dict 的某些值中。然而,一旦任务开始运行,my_csv 就会打开并写入未完成的值。在任务完成之前,如何阻止我的代码运行?有没有办法用 ray 做到这一点?

【问题讨论】:

【参考方案1】:

请注意,当您运行 ray 任务时,它们在不同的进程中运行。也就是说,my_dict 不会被共享!

这里正确的解决方案是使用演员。 Actor 是一个有状态的进程。

@ray.remote
class MyDict:
    def __init__(self):
        self.my_dict = 
    
    def insert(key, value):
        self.my_dict[key] = value

my_dict_handle = MyDict.remote()

@ray.remote
def f(n, my_dict_handle):
    # do something and get key, value for my dict
    my_dict_handle.insert.remote(key, value)

...

【讨论】:

您好,谢谢。我确实需要添加到预先存在的值(即 my_dict[key] + 1),那么如何使用此方法完成此操作?

以上是关于等到任务用 Python 中的 Ray 完成的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中使用 Ray 并行化任务,得到“Aborted (core dumped)”

我如何才能等到我的 Android 应用程序中的协程作用域执行完成?

ThreadPoolExecutor 动态任务执行,等到所有任务完成

JIRA python篇之展示多人未完成任务列表

等到 ListView smoothScrollToPosition() 完成

nodejs 等到循环中的所有 MongoDB 调用完成