У меня есть глобальная переменная в приложении Sinatra, которую я хочу обновить с помощью запланированной задачи из моего Rakefile. Обратите внимание, что приложение размещено на Heroku. Я настроил помощников для доступа к этой переменной.
get '/' do
@@var
end
helpers do
def get_var
return @@var
end
def set_var(value)
@@var = value
end
end
Вот задача в моем Rakefile:
task :do_something do
Sinatra::Application.set_var(get_data)
end
def get_data
# Retrieve value from external source
...
return val
end
Проблема, с которой я сталкиваюсь, заключается в том, что задача выполняется правильно, но переменная в приложении Sinatra никогда не обновляется. Я предполагаю, что это связано с тем, что вызов Sinatra::Application
из Rakefile фактически создает отдельный экземпляр приложения из основного экземпляра, который я пытаюсь обновить.
Я хочу знать, является ли это способом доступа к области действия работающего веб-приложения Sinatra из задачи Rakefile.
*Примечание. Я мог бы просто записать значение, полученное в запланированной задаче, в базу данных, а затем получить к нему доступ из приложения Sinatra, но это было бы излишним, потому что эта переменная обновляется так редко, но извлекается так регулярно, что я бы предпочел сохранить ее в памяти для более легкого доступа. Я изучил Memcache и Redis, чтобы не обращаться к базе данных, но опять же я чувствую, что это было бы чрезмерным для одного значения. Смело не соглашайтесь с этим.
РЕДАКТИРОВАТЬ: Что касается комментария Алексея Сухового, Heroku не позволяет записывать файлы за пределами каталогов tmp, и они не сохраняются достаточно долго, чтобы удовлетворить потребности приложения.