Ruby on Rails:를 실행하는 방법을 것입니다.
-
23-08-2019 - |
문제
새로운 자원이 만들어지고 그것을 할 필요가 일부 긴 처리 기 전에 자원은 준비,어떻게 보내는 처리를 거 배경으로 어디 그것은 won't hold up 현재 요청 또는 기타의 트래픽 나의 웹사-응용 프로그램?
내 모델:
class User < ActiveRecord::Base
after_save :background_check
protected
def background_check
# check through a list of 10000000000001 mil different
# databases that takes approx one hour :)
if( check_for_record_in_www( self.username ) )
# code that is run after the 1 hour process is finished.
user.update_attribute( :has_record )
end
end
end
해결책
다음 RailScasts를 반드시 확인해야합니다.
- http://railscasts.com/episodes/127-rake-in-background
- http://railscasts.com/episodes/128-starling-and-workling
- http://railscasts.com/episodes/129-custom-daemon
- http://railscasts.com/episodes/366-sidekiq
그들은 가능한 모든 방식으로 레일로 배경 프로세스를 실행하는 방법을 설명합니다 (대기열이 있거나없는 것 ...)
다른 팁
아마도 가장 쉽게 수행되는 별도의 프로세스를 시작합니다. system
, 'nohup'을 선물하고 '&'를 추가하는 명령의 끝에 당신이 그것을 전달합니다. (명령이 인수 목록이 아니라 하나의 문자열 인수인지 확인하십시오.)
예를 들어 스레드를 사용하려고하는 것이 아니라 이런 식으로하고 싶은 몇 가지 이유가 있습니다.
루비의 실은 I/O를 할 때 약간 까다로울 수 있습니다. 당신은 당신이하는 일이 전체 프로세스를 차단하지 않도록 조심해야합니다.
이름이 다른 프로그램을 운영하는 경우 'PS'에서 쉽게 식별 할 수 있으므로 우연히도 FastCGI 백엔드 사라지거나 무언가를 죽이고 죽인다고 생각하지 않습니다.
실제로, 당신이 시작하는 과정은 "deamonized"해야합니다. 데모네 화 도움을위한 수업.
나는 'Delayed_job'보석을 실험 해 왔으며 Heroku 호스팅 플랫폼과 함께 작동하기 때문에 엄청나게 설정하기가 쉬웠습니다 !!
보석을 Gemfile에 추가하고 bundle install
, rails g delayed_job
, rake db:migrate
그런 다음 큐 핸들러를 시작하십시오.
RAILS_ENV=production script/delayed_job start
긴 프로세스 인 메소드 호출이있는 곳 IE
company.send_mail_to_all_users
당신은 그것을 변경합니다.
company.delay.send_mail_to_all_users
GitHub에서 전체 문서를 확인하십시오. https://github.com/collectiveidea/delayed_job
당신은 이상적으로 사용하고 싶은 기존 작업을 서버를 작성하는 것보다 자신입니다.이러한 일반적으로 당신을 제출하는 작업이고 독특한 키;당신이 사용할 수 있습의 열쇠를 주기적으로 쿼리 jobserver 의 상태에 대한 귀하의 작업 없이 차단하겠습니다. 여기에 좋은 모집 의 다양한 옵션이 있습니다.
나는 BackgroundRB를 사용하는 것을 좋아합니다. 좋은 프로세스 중에 통신 할 수 있습니다. Rails 앱에서 상태 업데이트를 가질 수 있습니다.
제 생각에는 알 프로세스를 포크하고, 백그라운드에서 일부 처리를 수행하고,이 처리가 시작되었다는 확인을 보여주는 좋은 방법입니다.
는 어때:
def background_check
exec("script/runner check_for_record_in_www.rb #{self.username}") if fork == nil
end
프로그램 "check_for_record_in_www.rb
"그러면 다른 프로세스에서 실행되며 ActiveRecord에 액세스하여 데이터베이스에 액세스 할 수 있습니다.