使用Sinatra应用程序,找到了3种运行后台进程的方法:
Thread.new
Process.fork
Process.spawn
想出如何让前两个工作,但现在的挑战是测试需要同步运行(出于几个原因)。
在生产中异步运行作业的好方法是什么,但强制测试同步运行?最好通过spec_helper
...?
Ruby 1.9.3,Sinatra app,RSpec。
答案 0 :(得分:2)
我推荐以下混合方法:
编写简单的单元测试并重构您正在测试的同步。换句话说,将所有后台功能放入简单的类和方法中,可以轻松进行单元测试。然后后台进程可以调用相同的功能,这已经过单元测试。你不应该对后台线程/进程创建本身进行单元测试,因为这已经在ruby(或god
,bluepill
或Daemons
等其他库中进行了测试。这种TDD方法有使代码库更易于维护的额外好处。
对于功能和集成测试,请遵循delayed_job
的方法,并提供一种方法来同步完成所有后台工作,例如Delayed::Worker.new.work_off
您还可以考虑在产生线程或进程时使用EventMachine(如在Any success with Sinatra working together with EventMachine WebSockets?中),尤其是在后台进程是IO密集型的情况下(例如,发出http或数据库请求)。
答案 1 :(得分: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
我喜欢这个解决方案,因为它是透明的:它只是同步地运行 完全相同的代码 。
有任何建议/问题吗?是否有必要管理僵尸?怎么样?