gpt4 book ai didi

ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成?

转载 作者:数据小太阳 更新时间:2023-10-29 07:12:38 28 4
gpt4 key购买 nike

在我做的一些网络开发中,我有多个操作开始,比如对外部 API 的 GET 请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了 concurrent-ruby library这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中 FirstAsyncWorker 和 SecondAsyncWorker 是我编写的类,我在其中混合了 Concurrent::Async 模块,并编写了一个名为“work”的方法来发送 HTTP 请求:

def index
op1_result = FirstAsyncWorker.new.async.work
op2_result = SecondAsyncWorker.new.async.work

render text: results(op1_result, op2_result)
end

但是, Controller 将在操作方法执行结束时隐式呈现响应。因此响应在 op1_result 和 op2_result 获取值之前发送,并且唯一发送到浏览器的是“#”。

到目前为止,我对此的解决方案是使用 Ruby 线程。我写的代码是这样的:

def index
op1_result = nil
op2_result = nil

op1 = Thread.new do
op1_result = get_request_without_concurrent
end

op2 = Thread.new do
op2_result = get_request_without_concurrent
end

# Wait for the two operations to finish
op1.join
op2.join

render text: results(op1_result, op2_result)
end

我不使用互斥体,因为两个线程不访问相同的内存。但我想知道这是否是最好的方法。有没有更好的方法来使用 concurrent-ruby 库,或者其他更适合这种情况的库?

最佳答案

在对 concurrent-ruby 库进行更多研究后,我最终回答了我自己的问题。 Futures 最终成为我所追求的!简而言之,它们在后台线程中执行一段代码,并试图访问 Future 的计算值会阻塞主线程,直到该后台线程完成其工作。我的 Rails Controller 操作最终看起来像:

def index
op1 = Concurrent::Future.execute { get_request }
op2 = Concurrent::Future.execute { another_request }

render text: "The result is #{result(op1.value, op2.value)}."
end

带有 render 的行会阻塞,直到两个异步任务都完成,此时 result 可以开始运行。

关于ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40454494/

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