gpt4 book ai didi

ruby-on-rails - Ruby 中有类似 JS 'Promise.all()' 的东西吗?

转载 作者:太空宇宙 更新时间:2023-11-03 17:29:26 24 4
gpt4 key购买 nike

下面是一段需要优化的代码:

def statistics
blogs = Blog.where(id: params[:ids])
results = blogs.map do |blog|
{
id: blog.id,
comment_count: blog.blog_comments.select("DISTINCT user_id").count
}
end
render json: results.to_json
end

每个 SQL 查询花费大约 200 毫秒。如果我有 10 篇博文,这个函数将花费 2 秒,因为它是同步运行的。我可以使用 GROUP BY 来优化查询,但我先把它放在一边,因为任务可能是第三方请求,我对 Ruby 如何处理异步很感兴趣。

在 Javascript 中,当我想分派(dispatch)多个异步工作并等待它们全部解决时,我可以使用 Promise.all() .我想知道 Ruby 语言有哪些替代方案可以解决这个问题。

这种情况需要线程吗?在 Ruby 中这样做安全吗?

最佳答案

在 ruby​​ 中有多种方法可以解决这个问题,包括 promises(由 gems 启用)。

JavaScript 使用事件循环和事件驱动的 I/O 完成异步执行。在 ruby​​ 中有事件库可以完成同样的事情。最受欢迎的之一是 eventmachine .

正如你所说,线程也可以解决这个问题。线程安全是一个大话题,并且由于不同风格的 ruby​​(MRI、JRuby 等)中的不同线程模型而变得更加复杂。总而言之,我只是说当然可以安全地使用线程……有时候这会很困难。但是,当与阻塞 I/O(如 API 或数据库请求)一起使用时,线程可能非常有用且相当简单。线程的解决方案可能看起来像这样:

# run blocking IO requests simultaneously
thread_pool = [
Thread.new { execute_sql_1 },
Thread.new { execute_sql_2 },
Thread.new { execute_sql_3 },
# ...
]

# wait for the slowest one to finish
thread_pool.each(&:join)

您还可以访问其他货币模型,例如参与者模型、异步类、 promise 和其他由 concurrent-ruby 等 gem 启用的模型.

最后,ruby 并发可以采用通过内置机制(drb、套接字等)或通过分布式消息代理(redis、rabbitmq 等)进行通信的多个进程的形式。

关于ruby-on-rails - Ruby 中有类似 JS 'Promise.all()' 的东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50013832/

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