我如何 运行 多线程 Unicorn Sinatra 服务器中只有一个线程的函数?

How do I run a function in only one thread in a multi-threaded Unicorn Sinatra server?

我将我的 cron 任务放在一个模块中,然后放在我的 Sinatra 服务器中。

module Cron
  scheduler = Rufus::Scheduler.new

  scheduler.every "30m", :first => :now do
    run_cmd('git pull')
    puts "pulled the repo!!!"
  end
end

class MyServer < Sinatra::Base
  include Cron
end

应用程序的入口点是独角兽 (unicorn config/config.ru -p 9393 -c config/unicorn.rb),在 unicorn.rb 中,有这一行

worker_processes 7

因此,git pull 每30分钟运行ning七次,pulled the repo!!!打印七次。

有没有一种方法可以 运行 这个任务只在一个线程中进行?我尝试将它放在 worker_processes 7 行上方的 unicorn.rb 中,但我不确定这是否是此代码的最佳存放位置。

Unicorn 是一个多进程(不是多线程)Rack 服务器。不支持仅在一个工作进程中执行特定代码路径。

但是,您可以通过将 fork 后的工作人员编号保存到环境变量中,然后在您的应用程序代码中检查它的值来解决这个问题。

config/unicorn.rb中使用

after_worker_ready do |server, worker|
  ENV["WORKER_NR"] = worker.nr.to_s
end

在您的 Sinatra 应用程序中执行:

if unicorn_worker_nr == "0"
  scheduler.every "30m", :first => :now do
    ...
  end
end

def unicorn_worker_nr
  ENV["WORKER_NR"]
end