scheduler.every '1m', :overlap => false, :mutex => "my_lock" do
something...
end
此调度程序的作业是否等待上一次运行完成或跳过,如果它发现上一次运行仍在运行?
答案 0 :(得分:0)
有两种情况需要考虑,单一流程案例和多流程案例。
当您的Rails使用制作/调优的服务器来使用多个Ruby进程时,就会发生多进程情况。
服务器,我指的是Webrick,Unicorn,Passenger,Puma等......
在这两种情况下,都会在互斥锁之前考虑重叠。
在单个进程的情况下,overlap => false
将首先启动,调度程序将跳过传入的重叠作业。然后将考虑互斥锁(如果作业不重叠)并且可能使作业等待,直到相同作业的实例或指向同一互斥锁的作业实例释放互斥锁。
在多进程的情况下,您可能最终在每个Ruby进程中都有一个调度程序,并且overlap
和mutex
可能出现而不被尊重,而,在他们的本地Ruby流程中,他们是,但由于每个调度程序都有多个进程...
如果你有一台服务器为你提供了多个Ruby进程,而你想让一个rufus-scheduler处理它的工作,你必须阅读https://github.com/jmettraux/rufus-scheduler#lockfile--mylockfiletxt和https://github.com/jmettraux/rufus-scheduler#scheduler_lock还有多个专用的stackoverflow问题这个主题。