2010-04-19 7 views
0

나는 자원 집약적 인 perl cgi 스크립트를 가지고있다. (완료하는데 약 2 초 걸린다.) 이것은 최대 4 ~ 5 명이 동시에 실행되고있는 경우에만 괜찮습니다. 일반적으로 그렇게됩니다.mod_perl이 연결 당 하나의 프로세스 만 허용하게하려면 어떻게해야합니까?

문제는 사용자가이 스크립트를 호출하는 링크를 클릭하면 새로운 프로세스가 해당 연결 요청을 처리하기 위해 생성되므로 사용자가 여러 번 클릭하면 (참을성이있는 경우) 서버에 과부화가 발생한다는 것입니다. 새로운 프로세스가 실행되며 대부분 프로세스가 중복됩니다.

호스트 당이 프로세스의 인스턴스가 하나만 실행되도록하려면 어떻게해야합니까?

이것은 프론트 엔드 용 이전 프레임 워크를 사용하는 기존 시스템이며 가능한 경우 버튼 클라이언트 측을 비활성화하기 위해 javascript를 사용하지 않으려합니다. 이것을 fast-cgi perl로 변환하는 것은 문제가되지 않습니다. 왜냐하면 이것은 오래된 시스템이기 때문에 빠른 cgi를 아파치에 추가하는 것은이 일이 실행되는 많은 다른 것들을 망칠 수도 있기 때문입니다.

답변

1

파일 잠금을 사용하려고합니다. 응답 http://perldoc.perl.org/functions/flock.html

편집 의견을 :

#!/usr/bin/perl 

use strict; 
use warnings; 

use Fcntl qw(:flock); 

local *FH; 
my $opened_file = open(FH,'>/tmp/example_file.lck'); 
if ($opened_file) { 
    print "Lock file was opened successfully\n"; 
    if (flock(FH, &LOCK_EX | &LOCK_NB)) { 
     &do_stuff(); 
    } else { 
     print "Failed to get lock (another process is running)\n"; 
    } 
} else { 
    print "Failed to open lock file: $!\n"; 
} 
close(FH); 

sub do_stuff { 
    print "Locked!\n"; 
    sleep 30; # Pretending to be busy for a long time 
} 
+2

어떻게 그 일을 제안하는 : 잠금 파일을 사용

예제은 fcntl 모듈의 문서와 무리 기능을 읽기? – ysth

+0

은 여전히 ​​내가 원하는 것을하지는 않지만 원래 질문에 대답하므로 받아 들일 것입니다. –

관련 문제