【发布时间】:2013-11-13 11:18:24
【问题描述】:
我目前使用Sidekiq 作为在 Rails 4 上异步发送电子邮件的解决方案。
但是现在 Rails 是Threadsafe by default,这是用新线程替换Sidekiq 的好方法吗?该解决方案安全还是不合适?
谢谢京东
【问题讨论】:
标签: ruby-on-rails multithreading email asynchronous sidekiq
我目前使用Sidekiq 作为在 Rails 4 上异步发送电子邮件的解决方案。
但是现在 Rails 是Threadsafe by default,这是用新线程替换Sidekiq 的好方法吗?该解决方案安全还是不合适?
谢谢京东
【问题讨论】:
标签: ruby-on-rails multithreading email asynchronous sidekiq
Rails 4 默认是线程安全的不是意味着你的代码是自动神奇的线程安全的,只是 Rails 本身(框架)是线程安全的。
因此,我仍然认为坚持使用 Sidekiq 是个好主意,除非您绝对确定自己可以编写线程安全的实现来处理异步电子邮件发送。
【讨论】:
您在这里混淆了概念。 “Rails 是线程安全的”——这只是意味着 Rails 会锁定代码加载部分,从而减少发生灾难的机会(竞争条件等)。您自己的代码不会自动成为线程安全的。
另外,如果您正在接受 MRI(如果您不知道自己使用的是哪种 ruby,那么您正在接受 MRI) - 您一次只能运行一个线程。所以启动额外的线程真的没有任何好处——它会与其他线程同步。这些线程不会并行运行(我假设这是您的意图)。目前,在 MRI 上获得并行执行的唯一方法是多处理(运行多个进程)。这就是 Sidekiq 发挥作用的地方(双关语) - 这是一个额外的过程,可以并行运行您的作业。
不要使用线程,使用 sidekiq。
【讨论】: