新手问题 rails 里怎么实现轮询

liguangsong · 2015年10月19日 · 最后由 hmilym 回复于 2015年11月12日 · 4444 次阅读

想在 ruby 里实现以下功能,每隔 10 分钟向里另一个服务器发送请求,请求数据,应该怎么实现

用 Thread,然后 sleep 10 分钟

@ywjno 这个方法我应该放到哪里,如果放到 controller 里是不是每个人访问都会创建一个进程,但是希望有一个轮询进程

如果就是为了实现这个功能 用 Sidekiq 我觉得有点重了 写个脚本实现就可以了 利用 sleep 2.minute , 用 nohup bundle exec rake xxx 2>&1 & 启动!

最简单的方式 crontab

every 2.hours do
  runner "MyModel.some_process"
  rake "my:rake:task"
  command "/usr/bin/my_great_command"
end

https://github.com/javan/whenever

#3 楼 @liguangsong 到底是 ruby 还是 rails 啊。。。

#9 楼 @liguangsong 那你再看看你写的帖子标题

@liguangsong 轮训跟 rails 没必然关系啊,为什么一定要放到 controller 里面么?

@ripple 没有关系,我只是不知道放到哪里,怎么用,我现在用的是 whenever

放到 /config/initializer里面呢? rails 启动会去执行一下

@ripple Thread 新建进程 会不会出现两个进程同时操作数据库的情况

#17 楼 @liguangsong 会,但是没有问题啊,就是线程里的数据库连接要手动释放

@ripple 你的意思是不是两个进程同时操作数据库,也不会产生冲出?然后线程里的的数据库链接要怎么手动释放

  1. 如果有竞争性操作,可能需要锁表 http://api.rubyonrails.org/classes/ActiveRecord/Locking/Pessimistic.html
  2. 把线程里面的数据库操作放在一个 connection block 里面,执行完它会自动释放 http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html#method-i-with_connection

@ripple 万分感谢🙏!我去尝试下

写一个 ruby 类,initializer 目录下放个启动脚本,rails 启动的时候加载。

可以用 sidetiq

cronjob 最简单

需要 登录 后方可回复, 如果你还没有账号请 注册新账号