【发布时间】:2017-04-20 00:15:14
【问题描述】:
我正在使用 postgresql 在 puma 上运行带有 Ruby 2.3.3 的 Rails 3。我有一个初始化程序/twitter.rb 文件,它在启动时使用 twitter 的流 api 启动一个线程。当我使用rails server 启动我的应用程序时,推特流媒体工作正常,我可以正常访问我的网站。 (如果我不将流媒体放在不同的线程上,流媒体工作但我无法在浏览器中查看我的应用程序,因为线程被 twitter 流阻止)。但是当我使用puma -C config/puma.rb 启动我的应用程序时,我收到以下消息,告诉我我的线程在启动时被发现并进入睡眠状态。如何告诉 puma 让我在启动时在后台运行这个线程?
初始化程序/twitter.rb
### START TWITTER THREAD ### if production
if Rails.env.production?
puts 'Starting Twitter Stream...'
Thread.start {
twitter_stream.user do |object|
case object
when Twitter::Tweet
handle_tweet(object)
when Twitter::DirectMessage
handle_direct_message(object)
when Twitter::Streaming::Event
puts "Received Event: #{object.to_yaml}"
when Twitter::Streaming::FriendList
puts "Received FriendList: #{object.to_yaml}"
when Twitter::Streaming::DeletedTweet
puts "Deleted Tweet: #{object.to_yaml}"
when Twitter::Streaming::StallWarning
puts "Stall Warning: #{object.to_yaml}"
else
puts "It's something else: #{object.to_yaml}"
end
end
}
end
config/puma.rb
workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5)
threads threads_count, threads_count
preload_app!
rackup DefaultRackup
port ENV['PORT'] || 3000
environment ENV['RACK_ENV'] || 'development'
on_worker_boot do
# Valid on Rails up to 4.1 the initializer method of setting `pool` size
ActiveSupport.on_load(:active_record) do
config = ActiveRecord::Base.configurations[Rails.env] ||
Rails.application.config.database_configuration[Rails.env]
config['pool'] = ENV['RAILS_MAX_THREADS'] || 5
ActiveRecord::Base.establish_connection(config)
end
end
启动消息
2017-04-19T23:52:47.076636+00:00 app[web.1]: Connecting to database specified by DATABASE_URL
2017-04-19T23:52:47.115595+00:00 app[web.1]: Starting Twitter Stream...
2017-04-19T23:52:47.229203+00:00 app[web.1]: Received FriendList: --- !ruby/array:Twitter::Streaming::FriendList []
2017-04-19T23:52:47.865735+00:00 app[web.1]: [4] * Listening on tcp://0.0.0.0:13734
2017-04-19T23:52:47.865830+00:00 app[web.1]: [4] ! WARNING: Detected 1 Thread(s) started in app boot:
2017-04-19T23:52:47.865870+00:00 app[web.1]: [4] ! #<Thread:0x007f4df8bf6240@/app/config/initializers/twitter.rb:135 sleep> - /app/vendor/ruby-2.3.3/lib/ruby/2.3.0/openssl/buffering.rb:125:in `sysread'
2017-04-19T23:52:47.875056+00:00 app[web.1]: [4] - Worker 0 (pid: 7) booted, phase: 0
2017-04-19T23:52:47.865919+00:00 app[web.1]: [4] Use Ctrl-C to stop
2017-04-19T23:52:47.882759+00:00 app[web.1]: [4] - Worker 1 (pid: 11) booted, phase: 0
2017-04-19T23:52:48.148831+00:00 heroku[web.1]: State changed from starting to up
提前感谢您的帮助。我看过其他几篇提到WARNING: Detected 1 Thread(s) started in app boot 的帖子,但答案说如果线程不重要,则忽略警告。就我而言,线程非常重要,我需要这个线程不休眠。
【问题讨论】:
-
更新:我了解了睡眠线程的真正含义,这不是问题所在。但是,我不确定从哪里开始我的 twitter 流线程。它应该留在初始化程序中吗?我应该使用单独的进程(后台应用程序)吗?我应该在每个 puma 工人上启动 twitter 流吗?
标签: ruby-on-rails ruby puma