在Rails Observer中使用线程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Rails Observer中使用线程相关的知识,希望对你有一定的参考价值。

据我所知,Ruby on Rails中的Observer模式不是异步的,这意味着Observer的执行将阻止正在处理的动作。

我知道delayed_job gem我真的很喜欢它,但有时它看起来有点太重了某些用途。

如何在Observer的回调中启动一个新线程呢?

我花了一些时间试图找到这种方法的优点和缺点,但失败了。

所以问题是:Observer的线程有任何严重的缺点吗?

答案

你听说过sidekiq吗?这是进行后台处理的新“热门”宝石(vs resque或delayedjob)。

来自FAQ

sidekiq使用redis进行存储并在多线程进程中处理消息。设置resque同样容易,但在原始处理速度方面更有效。您的工作人员代码确实需要是线程安全的。

还有关于它的轨道广播here

与创建自己的线程相比,我建议使用它。

另一答案

DelayedJob和Sidekiq都提供了很好的选择,Rails现在提供完整的ActiveJob支持,这里是官方文档 - https://guides.rubyonrails.org/v4.2/active_job_basics.html

DelayedJob我认为已经是最长的,由建立Shopify.com的工作人员创建。它会在您的rails应用程序中创建一个表,并排队等候。对我来说,它提供了最简单的选项,因为它不包含除rails应用程序之外的其他依赖项。

Sidekiq也是一个很好的选择。它也非常简单且维护良好,但它不使用您的数据库,而是使用redis服务器来管理作业。这使得开发变得有点棘手,因为您必须安装redis并记得在运行应用程序时启动它。不难,只是一些额外的东西。

这是一个快速指南比较两个 - DelayedJob vs. Sidekiq,希望有所帮助。

以上是关于在Rails Observer中使用线程的主要内容,如果未能解决你的问题,请参考以下文章

Rails Observer 4.0 的替代品

与观察者更改商品价格后如何更新购物车总数?

error C2440

如何在 Rails 3 中使用多线程?

在 Rails 线程中访问变量

如何在多线程 C++ 中拆除观察者关系?