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

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

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

共收到 25 条回复

用 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最简单

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