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

时间:2009-03-25 19:16:38

标签: ruby-on-rails green-threads

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

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

由于

4 个答案:

答案 0 :(得分:2)

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

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

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

另请注意,一旦提供请求,您就会对Rails流程的生命周期做出假设。许多Rails应用程序使用DRb(或类似工具)将这些后台任务卸载到完全独立的工作进程上。最简单的方法是经常更改 - 请参阅Google a number of popular libraries

答案 1 :(得分:2)

发送该电子邮件时,全局虚拟机锁定几乎肯定会适用,这意味着没有区别。

您不应该在请求/响应周期中启动线程。你不应该开始创建线程,除非你可以从创建到加入观看它们,即使这样,它也很难为它创造的麻烦。

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

This article更详细地解释。如果要异步发送消息,请使用BackgroundRb或其模拟。

答案 2 :(得分:2)

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

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

如果你急需一些东西然后试一试,它一直在为我们工作。

答案 3 :(得分:1)

就我所知,它们将是相同的。