문제

새로운 자원이 만들어지고 그것을 할 필요가 일부 긴 처리 기 전에 자원은 준비,어떻게 보내는 처리를 거 배경으로 어디 그것은 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를 반드시 확인해야합니다.

그들은 가능한 모든 방식으로 레일로 배경 프로세스를 실행하는 방법을 설명합니다 (대기열이 있거나없는 것 ...)

다른 팁

아마도 가장 쉽게 수행되는 별도의 프로세스를 시작합니다. system, 'nohup'을 선물하고 '&'를 추가하는 명령의 끝에 당신이 그것을 전달합니다. (명령이 인수 목록이 아니라 하나의 문자열 인수인지 확인하십시오.)

예를 들어 스레드를 사용하려고하는 것이 아니라 이런 식으로하고 싶은 몇 가지 이유가 있습니다.

  1. 루비의 실은 I/O를 할 때 약간 까다로울 수 있습니다. 당신은 당신이하는 일이 전체 프로세스를 차단하지 않도록 조심해야합니다.

  2. 이름이 다른 프로그램을 운영하는 경우 '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에 액세스하여 데이터베이스에 액세스 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top