1

使用 Sinatra 应用程序,发现了 3 种运行后台进程的方法:

  1. Thread.new
  2. Process.fork
  3. Process.spawn

想出了如何让前两个工作,但现在的挑战是测试需要同步运行(有几个原因)。

在生产中异步运行作业但强制测试同步运行的好方法是什么?最好在spec_helper...中打电话?

Ruby 1.9.3、Sinatra 应用程序、RSpec。

4

2 回答 2

2

我推荐以下混合方法:

  1. 编写简单的单元测试并将您正在测试的内容重构为同步的。换句话说,将所有后台功能放入可以轻松进行单元测试的简单类和方法中。然后后台进程可以调用已经过单元测试的相同功能。您不必对后台线程/进程创建本身进行单元测试,因为这已经在 ruby​​(或其他库,如god,bluepillDaemons.

  2. 对于功能和集成测试,遵循 的方法delayed_job并提供一种方法来同步完成所有后台工作,例如Delayed::Worker.new.work_off

您可能还需要考虑使用 EventMachine(如在任何成功与 Sinatra 与 EventMachine WebSockets 一起工作?)而不是产生线程或进程,特别是如果后台进程是 IO 密集型的(例如,发出 http 或数据库请求)。

于 2012-12-12T01:38:57.713 回答
0

这是我想出的:

process_in_background { slow_method }

def process_in_background
  Rails.env == 'test' ? yield : Thread.new { yield }
end

def slow_method
  ...code that takes a long time to run...
end

我喜欢这个解决方案,因为它是透明的:它运行完全相同的代码,只是同步运行。

有什么建议/问题吗?有必要管理僵尸吗?如何?

于 2012-12-12T02:00:57.740 回答