我使用的Ruby库假定它在eventmachine(Faye)中运行,并且如果它不在EM.run上下文中,则在单独的线程中启动eventmachine reactor。当在瘦服务器内启动Rails应用程序时,没问题。但对于后台作业,Rails环境已加载,然后启动resque,这会为每个作业生成一个新进程(下面的self.perform方法)。
所以,我知道我有反应堆运行,但我需要知道从self.perform
返回是否安全,因为这将退出当前进程并切断EM反应堆中的任何待处理操作。或者,我可以在EM.run
块内运行该作业,但是需要知道何时可以安全退出。
class AsanaPopulateJob
@queue = :profiles
def self.logger; Rails.logger; end
def self.perform(ident_id)
begin
logger.debug "==> Start AsanaPopulateJob[#{ident_id}]"
ident = Identity.find(ident_id)
conn = AsanaConnector.new(ident)
Faye.ensure_reactor_running!
conn.populate_profile!
logger.debug "=== Sleep 5..."
sleep(5)
ensure
logger.debug "<== Done AsanaPopulateJob[#{ident_id}]"
end
end
end
现在,我正在运行调用em-hiredis的函数调用,然后睡眠5秒钟让事情稳定下来。当然还有更好的东西。