나는 PHP 환경 (적어도 웹 개발자 측면에서)과 Ruby의 아름다운 세계로 간다. 그래서 나는 바보 같은 질문을할지 모른다. PHP를 사용하지 않을 때 근본적으로 다른 옵션을 사용할 수 있다고 생각합니다.레일스 우수 사례 : 백그라운드 프로세스/스레드?
PHP에서는 memcache를 사용하여 페이지 상단의 막대에 표시 할 경고를 저장합니다. 어떤 일이 발생하면 (예 : 새로운 블로그 게시물이 만들어 짐과 같은) 경고를 생성하면 5 분마다 한 번씩 실행되는 cron 스크립트가 해당 정보를 memcache에 저장합니다.
사용자가 사이트를 방문하면 memcache가 이미 해고하지 않은 경고를 찾아서 표시합니다.
레일스에서 다르게 할 수있는 것은 cron 스크립트의 필요성을 우회하는 것이며 모든 요청에 대해 memcache를 살펴볼 필요가 있습니다. 싱글 톤과 폴링 프로세스를 실행하여 memcache에서이 싱글 톤으로 복사 할 별도의 스레드. 이것은 이론적으로 요청 당 Memcache를 검사하는 것보다 최적화되고 cron 작업과 조회 논리 사이에서 분리되는 대신 폴링 논리를 한 곳으로 캡슐화합니다.
내 질문은 : 레일 앱이 실행되는 동안 배경에 일종의 runloop이 있다는 경고가 있습니까? Objective-C/Java에서 멀티 스레딩의 함축적 의미를 이해하고 있지만 레일스 (Rails) 환경에 대해 구체적으로 묻고 있습니다.
은 기본적으로 같은 일이 :
class SiteAlertsMap < Hash
include Singleton
def initialize
super
begin_polling
end
# ... SNIP, any specific methods etc ...
private
def begin_polling
# Create some other Thread here, which polls at set intervals
end
end
이 비슷한 질문에 날 리드. 우리는 전자 상거래 및 장기 실행 백그라운드 작업과 관련하여 작업을 SQS 대기열에 푸시 (암호화)합니다. 우리는 이것을 위해 cron을 사용하지 않고 백그라운드에서 실행되는 PHP로 작성된 작업자 데몬을 사용합니다. 현재 배포 할 때이 작업자를 종료하고 새 코드 기반에서 다시 시작해야합니다. Rails에서 어떻게 든이 프로세스를 시작하고 레일 서버 (유니콘) 자체로 멈출 수 있습니까? 우리가 자주 프로세스로 제어하려고하기 때문에 별도의 스레드에서 주 프로세스에서 실행하고 싶지는 않지만 웹 응용 프로그램이 실행 중일 때 편리하게 실행되면 좋을 것입니다.
고마워, 당신 말이 맞아, 나는 쓰레드를 사용하지 않기로 결정했다. 쓰레드와의 비 호환성 때문에 나는 dev의 불쾌한 행동을 관찰했다. Resque 및 delayed_job 링크에 감사드립니다. 오늘 아침에 커피 한잔 읽어 줄게. 아마도 Rails 앱과 분리되어있는 것들을 위해 사용할 수 있지만, 여전히 많은 것들이 PHP에 있습니다 (앱은 공존하고 있습니다). 나는 녹색 스레드를 사용하여 루비에 대해 읽었지만,이 경우에 관심이있는 것을 보지 못했습니다. :) – d11wtq