2013-07-06 61 views
0

我正在编写一个简单的Ruby on Rails应用程序,它对ROR知之甚少。该应用程序将定期查询Twitter和Instagram,为特定用户提取Feed并将其存储在某个位置,然后可以在特定用户的推文或照片的请求到达时快速访问。Rake任务访问Web应用程序的全局变量

我正在考虑编写一个rake任务,这个任务将会定期获取tweets和instagram照片。

如果webapp使用全局变量来获取feed,那么rake任务可以访问这个全局变量并更新它吗?

还是必须使用数据库如此耙和Web应用程序可以更新/访问相同的数据?

回答

2

耙子任务通常运行在它自己的进程中,所以它不能与你的主应用程序共享状态。然而,你可以做的是在你的应用程序中创建一个类来获取提要并将其与时间戳一起存储。每当该时间戳到期时,它将创建一个新的请求。但是,虽然易于实现,但是这会导致请求在缓存过期后到达请求时减慢一点,因为应用程序需要从Twitter和Instagram获取数据作为请求的一部分。

+0

您认为如何编写一个控制器,其唯一目的是获取推文和照片并使用新数据更新全局变量。然后有一个cron作业定期调用curl来触发控制器? – septerr

+0

另外,如果我执行控制器+ cron,是否会使web应用程序繁忙并导致定期请求到达队列? Rails服务器是否运行多个线程来处理请求或单个线程?对不起,有很多问题。 – septerr

+0

完全取决于部署配置。由于cronjob与rails服务器进程在同一台计算机上运行,​​因此可能会耗尽资源,从而可能会降低http性能。在实践中,像你描述的任务只会占用最少的CPU资源。使用cron/rake任务时,必须将数据存储在本地数据库中,并让rails服务器访问该数据库。 –

0

如果你构建你的Rake任务的依赖来加载你的Rails应用程序,那么你可以访问你的Rails应用程序所有相同的数据。

desc 'My polling rake task' 
task :twitter_pool => :environment do 
    m = MyModel.find(123) # access models 
    MyModel::CONSTANT 
    ... # etc. 
end 

“=>:环境”是重要的部分。

+1

您确定这可行吗?如果常量被定义为rake任务的一部分,它应该只存在于运行任务的进程中。没有? –

+1

由于Neils B说你不能共享状态,所以这不会按需要工作,我误解了你的问题。你最好的选择是轮询和缓存为Neils descibes –

+0

我尝试过这样的事情,但是当从webapp调用相同的代码以及从rake任务调用它时,全局变量不一样。所以我相信Niels和Peer是对的。 – septerr