【问题标题】:Using Thread.new to send email on rails使用 Thread.new 在 Rails 上发送电子邮件
【发布时间】:2009-03-25 19:16:38
【问题描述】:

我一直在这样的应用程序(ruby 1.8.7,rails 2.3.2)上发送电子邮件 Thread.new{UserMailer.deliver_signup_notification(user)}

由于 ruby​​ 使用绿色线程,这样做有任何性能优势,或者我可以使用 UserMailer.deliver_signup_notification(user) ?

谢谢

【问题讨论】:

  • JRuby 和 Rubinius 使用真实的系统线程。

标签: ruby-on-rails green-threads


【解决方案1】:

几乎可以肯定,在发送该电子邮件时,全局 VM 锁定仍然适用,这意味着没有区别。

您不应在请求/响应周期中启动线程。你根本不应该启动线程,除非你可以观察它们从创建到加入,即使那样,它也很少值得它制造的麻烦。

Rails 不是线程安全的,并不意味着来自您的控制器操作。只有在 Rails 2.3 之后,只是调度是线程安全的,并且只有在 environment.rb 中使用 config.threadsafe 开启它!

This article 更详细地解释。如果您想异步发送消息,请使用BackgroundRb 或其类似物。

【讨论】:

    【解决方案2】:

    一般来说,使用绿色线程异步运行后台任务意味着您的应用程序可以在发送邮件之前响应用户。您不必担心利用多个 CPU;您只关心将工作卸载到后台进程并尽快返回网页。

    从检查 Rails 文档来看,deliver_signup_notification 似乎会阻塞足够长的时间以使邮件排队(尽管我可能错了)。因此,在此处使用线程可能会使您的应用程序看起来更具响应性,具体取决于您的邮件程序的配置方式。

    不幸的是,我不清楚deliver_signup_notification 是否一定是线程安全的。在依赖它之前,我想仔细阅读文档。

    还要注意,一旦请求得到处理,您正在对 Rails 进程的生命周期做出假设。许多 Rails 应用程序使用 DRb(或类似工具)将这些后台任务卸载到一个完全独立的工作进程上。执行此操作的最简单方法经常更改 - 请参阅 Google 获取 a number of popular libraries

    【讨论】:

      【解决方案3】:

      我已经使用了您的确切策略,我们的应用程序目前正在生产中运行(但 rails 2.2.2)。我一直密切关注它,我们的负载相对较低(平均每天发送的电子邮件不到 20 封,峰值约为 150 封/天)。

      到目前为止,我们没有发现任何问题,这似乎解决了我们在使用 Google 邮件服务器时遇到的几个性能问题。

      如果您急需某些东西,那就试一试,它一直在为我们工作。

      【讨论】:

        【解决方案4】:

        据我所知,它们是一样的。

        【讨论】:

          猜你喜欢
          • 2013-11-13
          • 2015-08-26
          • 2015-08-25
          • 2014-07-11
          • 1970-01-01
          • 2011-10-25
          • 2011-10-02
          • 1970-01-01
          • 2021-07-08
          相关资源
          最近更新 更多