我如何 运行 多线程 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
我将我的 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