2013-11-23 2 views
0

주 함수에서 MySQL 데이터베이스 작업을 수행하는 여러 함수를 호출하는 Perl 스크립트가 있습니다. 그러나 전체 스크립트가 너무 느리고 로그 메시지를 인쇄하여 컨트롤을 주 기능으로 되돌리기 전에 마치 "대기 중"인 것처럼 보였습니다.Perl 함수는 main 함수로 1을 반환하기 전에 "대기"합니다.

MySQL의 processlist를 보면 NULL 정보가 들어간 Sleep 프로세스가 나타납니다. Perl 스크립트 자체가 명령을 수행했지만 Perl 함수가 메인 함수로 돌아 가지 않습니다. , 모든 것이 성공적으로 완료되었습니다.

예 : log2log3 사이에,이 시간까지의 MySQL의 PROCESSLIST의 수면 과정이

use IO::Handle; 
STDERR->autoflush(1); 
STDOUT->autoflush(1); 

sub SomeFunction{ 
    // writing into MySQL database 
    print localtime()."log2"; 
    return 1; 
} 

print localtime()."log1"; 
&SomeFunction(); 
print localtime()."log3"; 

지연입니다.

이 문제의 원인은 무엇이며 어떻게이 스크립트의 성능을 향상시킬 수 있습니까?

+1

이러한 인쇄 문이 버퍼링되면 실제로 그 내용을 결론 지을 수 없습니다. 메시지뿐만 아니라 정확한 시간을 인쇄하고 자동 플러시를 켭니다. – Mat

+0

죄송합니다. 물론 메시지에 연결되어있는 localtime()을 사용하는 것을 잊었습니다. 다음 코드는 입니다.'IO :: Handle; STDERR-> autoflush (1); – martoncsukas

+0

이 동작을 실제로 보여주는 최소한의 실제 예제를 보여줄 수 있습니까? 지침은 [SSCCE.org] (http://sscce.org/)를 참조하십시오. 현재 코드는 컴파일되어서도 컴파일되지 않습니다 ('_SomeFunction' vs'SomeFunction',''log2'',''log3;''닫는 따옴표가 없습니다). – amon

답변

3

Perl은 범위 종료시 아무 것도 기다리지 않습니다. 그러나 범위를 종료하면 임의의 코드가 실행될 수 있습니다. 예를 들어 스코프를 종료하면 객체가 참조 해제되고 소멸 될 수 있습니다. 소멸자를 호출해야합니다. other means도 있습니다.

관련 문제