gpt4 book ai didi

ruby-on-rails - Rails 中的并行化方法

转载 作者:行者123 更新时间:2023-12-03 13:52:40 32 4
gpt4 key购买 nike

我的 Rails Web 应用程序有几十种方法,从调用 API 到处理查询结果。这些方法具有以下结构:

def method_one
batch_query_API
process_data
end
..........
def method_nth
batch_query_API
process_data
end

def summary
method_one
......
method_nth
collect_results
end

如何在 Rails 中同时运行所有查询方法而不是顺序运行(当然,不会启动多个工作人员)?

编辑:所有方法都是从单个实例变量调用的。我认为这限制了 Sidekiq 或延迟同时提交作业的使用。

最佳答案

Ruby 拥有出色的 promise gem 。您的示例如下所示:

require 'future'

def method_one
...
def method_nth

def summary
result1 = future { method_one }
......
resultn = future { method_nth }
collect_results result1, ..., resultn
end

很简单,不是吗?但让我们了解更多细节。这是一个 future 的对象:
result1 = future { method_one }

这意味着, result1正在后台进行评估。您可以将其传递给其他方法。但是 result1还没有任何结果,它仍在后台处理。想想传递一个线程。但主要区别在于 - 当您尝试阅读它时,它不会传递它,而是阻塞并等待此时的结果。所以在上面的例子中,所有 result1 .. resultn变量将继续在后台进行评估,但是当收集结果时,当您尝试实际读取这些值时,读取将等待查询在此时完成。

安装 promise gem 并在 Ruby 控制台中尝试以下操作:
require 'future'
x = future { sleep 20; puts 'x calculated'; 10 }; nil
# adding a nil to the end so that x is not immediately tried to print in the console
y = future { sleep 25; puts 'y calculated'; 20 }; nil

# At this point, you'll still be using the console!
# The sleeps are happening in the background

# Now do:
x + y
# At this point, the program actually waits for the x & y future blocks to complete

编辑: result 中的错字, 应该是 result1 , 更改 echoputs

关于ruby-on-rails - Rails 中的并行化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16551466/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com