2011-01-12 2 views
5

안녕
일부 초기 사용자 입력 후에 루비에 대한 c 확장을 통해 멀티 스레딩을 사용하는 무거운 계산이 수행되는 레일즈 웹 사이트를 설정하려고합니다. 이 계산은 거의 모든 CPU 시간 (메모리도)을 소모하므로 한 번에 하나 이상의 계산이 실행되지 않아야합니다. 또한 나는 (비동기) 배경 작업 (예 : 지연된 작업)을 사용할 수 없습니다. 레일스는 계산 결과를 표시해야하고 사이트는 자바 스크립트없이 작동해야합니다.
그래서 모든 레일 인스턴스가 계산 요청을 대기열에 넣고 응답 (대기열이 가득 찼을 경우 오류 메시지 일 수 있음), 동기 작업 관리자 종류를 기다려야하는 별도의 프로세스가 필요하다고 가정합니다.Ruby/Rails 동기 작업 관리자

보석/플러그인과 같은 기능이 있는지 누가 알 수 있습니까? (nanite은 나에게 아주 멋있어 보이지만, 비동기식 인 것처럼 보이기 때문에 레일스 인스턴스는 계산이 끝났을 때 알 수 없습니다.)
또 다른 아이디어는 분산 루비 (drb)를 사용하여 직접 작성하는 것입니다. 그러나 이미 존재한다면 바퀴를 다시 발명하는 이유는 무엇입니까?

어떤 도움도 받으실 수 있습니다!

편집 : 왜냐하면 나는 비동기 적으로이 작업을 수행 할 수 있다고 생각하기 때문에 resque을 시도 할 것입니다. 당신이 별도의 프로세스가있는 경우

답변

5

루비 뮤텍스/세마포어를 갖는다.

당신은 확실히 하나의 자원 집약적 인 프로세스가 동시에 일어나고 확인하기 위해 세마포어를 사용할 수 있습니다.

그러나, 다른 작업은 나에게 잘 보이지 않는다 완료하는 동안 프론트 엔드 프로세스를 차단의 생각.이 작업을 수행하는 경우 백그라운드 작업자를 사용하고 새로 고침 메타 태그가있는 페이지 (또는 iframe)를 사용하여 진행 상황을 지속적으로 확인합니다.

그런 식으로

, 당신은 자바 스크립트를 활성화 및 비활성화 클라이언트 모두에 대해 동일한 코드를 사용할 수 있습니다. 그리고 귀하의 웹 응용 프로그램 스레드가 차단되지 않습니다.

+0

그 metarefresh 일이 가능하지만 계산을 끝내지 않은 경우 수동으로 페이지를 다시로드하는 사용자가 내 눈을 너무 userfriendly되지 않습니다. atm 나는 동시에 많은 요청을 기대하지 않으므로 웹 스레드를 차단하는 것이 큰 문제가되지 않습니다. 하지만 당신이 옳아, 그걸하는 좋은 방법이 아니야. – user573335

+0

처음 새로 고침 후 작업이 완료되지 않은 경우 메타 새로 고침을 원하는 횟수만큼 수행 할 수 있습니다. 새로 고침 한 페이지를 표시하고 작업 완료 후 마지막 페이지 만 표시하십시오. – zaius

+0

글쎄, 나는 그것에 대해 조금 주저하지만, 더 많이 생각하면할수록 적어도 장기적으로는 비동기 적으로 더 나은 해결책이 될 것 같다. 대기열에 너무 많은 작업이있을 경우 웹 스레드에서 예상 작업 시간 (웹 스레드에서)을 요청할 수 있고 웹 스레드에 오류 메시지를 반환 할 수있는 작업 큐가 있습니까? – user573335

1

는, 당신은 백그라운드 작업이 ... 그러니 당신은

은 내가 무슨 짓을하는 것은 웹 사이트가 요청 PARAMS 쓰기가입니다 ... 당신이 할 수없는 그것을 가지고 또는 수 데이터베이스에. 그런 다음 별도의 프로세스가 daemons gem을 사용하여 데이터베이스에서 보류중인 요청을 찾습니다. 작업을 수행하고 결과를 데이터베이스에 다시 씁니다.

그러면 웹 사이트는 결과가 준비 될 때까지 데이터베이스를 폴링 한 다음 표시합니다.

나는 자바 스크립트를 사용하여 폴링을 수행하지만.

자바 스크립트를 실제로 사용할 수 없다면 웹 요청 스레드에서 작업을 수행하거나 해당 스레드가 백그라운드 스레드가 끝날 때까지 기다릴 필요가있는 것처럼 보입니다.

웹 요청 스레드를 대기 상태로 만들려면 회신을 다시 저장할 때까지 데이터베이스를 확인하면서 루프를 수행하십시오. 일단 거기에, 당신은 다음 스레드를 완료 할 수 있습니다.

HTH 크리스

+0

좋아, 웹 요청 스레드가 백그라운드 작업이 끝날 때까지 기다릴 수있는 방법을 알고 계십니까? 웹 reuest 스레드가 백그라운드 스레드를 생성 할 수 없기 때문에, 어떻게해야할지 모르겠다. – user573335