我正在用PostgreSQL的彪馬與Ruby 2.3.3上運行Rails 3。我有一個初始化器/ twitter.rb文件,在啓動時使用流API傳輸啓動線程。當我使用rails server
開始我的應用程序時,Twitter流式傳輸可以正常工作,並且可以正常訪問我的網站。 (如果我不把流傳輸到不同的線程上,流式傳輸可以工作,但由於線程被Twitter流阻止,我無法在瀏覽器中查看我的應用程序)。但是,當我使用puma -C config/puma.rb
來啓動我的應用程序時,我收到以下消息,告訴我我的線程在啓動時找到並進入睡眠狀態。我如何告訴美洲獅讓我在啓動時在後臺運行這個線程?彪馬睡在鐵軌應用程序的啓動一個重要的線程
初始化/ 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
配置/ 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:[email protected]/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流線程。它應該留在初始化器中嗎?我應該使用單獨的進程(後臺應用程序)嗎?我應該啓動每個美洲獅工人的Twitter流嗎? –