代码之家  ›  专栏  ›  技术社区  ›  Rafael Mueller

使用Thread.new在rails上发送电子邮件

  •  3
  • Rafael Mueller  · 技术社区  · 15 年前

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

    因为ruby使用绿色线程,所以这样做有任何性能优势,或者我可以直接使用 UserMailer.deliver_signup_notification(user) ?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Sam Coles    15 年前

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

    您不应该在请求/响应周期中启动线程。你不应该启动线程,除非你能从一个线程创建到另一个线程加入,即使这样,它也很少值得你为它制造麻烦。

    Rails不是线程安全的,也不意味着来自控制器操作。只是因为Rails 2.3已经 刚刚发送 只有在使用config.threadsafe!在environment.rb中将其打开时,才能使用线程安全!。

    This article 更详细地解释。如果要异步发送消息,请使用 BackgroundRb 或者它的类似物。

        2
  •  2
  •   emk    15 年前

    通常,使用绿色线程异步运行后台任务意味着您的应用程序可以响应用户

    从Rails文档来看,deliver_signup_通知的阻塞时间足以让邮件排队(尽管我可能错了)。因此,在这里使用线程可能会使应用程序看起来更具响应性,这取决于邮件程序的配置方式。

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

    还要注意的是,您正在假设一个请求被服务后Rails进程的生存期。许多Rails应用程序使用DRb(或类似工具)将这些后台任务卸载到一个完全独立的工作进程上。要做到这一点,最简单的方法是经常更改--请参阅谷歌以了解更多信息 a number of popular libraries .

        3
  •  2
  •   Gdeglin    15 年前

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

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

    如果你急着需要什么,那就试试看,它一直在为我们工作。

        4
  •  1
  •   Brian    15 年前

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