2008-09-26 2 views
3

필자는 perl에서 여러 스레드가 아닌 안전한 모듈에 의존해야하는 다중 스레드 응용 프로그램을 가지고 있으므로 메시지를 전달하는 인터페이스로 kill() 신호와 함께 fork() ed 프로세스를 사용하고 있습니다.Perl에서 관리되는 프로세스 (실제로 작동하는 스레드 대체)가있는 방법이 있습니까?

문제는 시그널 핸들러가 다소 엉뚱한 말로서 부적절한 상태에서 죽게되는 프로세스로 끝나는 경우가 있습니다.

더 좋은 방법이 있나요?

답변

4

forks.pm, "훨씬 더 합리적인 메모리 사용을 위해 (그러나 Win32에서 사용하지 않는) fork()를 사용하는 Perl 스레드 대체"를 살펴보십시오. 그것은 "공유 된"변수를 선언 할 수있게 해주고 그런 변수들에 대한 변경 사항을 프로세스간에 자동으로 전달합니다 (threads.pm과 같은 방식으로).

1

perl 5.8부터 코어 스레드 모듈을 살펴야합니다. 살펴보기 http://metacpan.org/pod/threads

스레드 안전하지 않은 모듈을 사용하려면 일반적으로 스레드를로드하고 thread 진입 점 내에 import해야합니다.

6

항상 부모와 자식 사이에 메시지를주고받을 수있는 파이프가 있습니다.

pipe my $reader, my $writer; 
my $pid = fork(); 
if ($pid == 0) { 
    close $reader; 
    ... 
} 
else { 
    close $writer; 
    my $msg_from_child = <$reader>; 
    .... 
} 

아주 편한 프로그래밍 방법은 아니지만 '엉뚱한'것이 아닙니다.

7

정확히 무엇을해야하는지에 따라 사용자 공간 스레드가있는 멀티 스레드 응용 프로그램을위한 Perl 프레임 워크 인 POE을 사용하는 것이 좋습니다. 복잡하지만 우아하고 강력하며 단일 Perl 인터프리터 스레드에 활동을 한정하여 스레드 안전하지 않은 모듈을 피할 수 있습니다.

유용한 리소스를 시작합니다 :

플러스가을 (그것이이고 무엇을하는지 이해하는 경우 여기에서 시작) 수백 개의 사전 빌드 된 POE components을 사용하여 응용 프로그램으로 어셈블 할 수 있습니다.

관련 문제