2013-11-23 45 views
0

我有一個Perl腳本,它調用幾個執行主函數中MySQL數據庫任務的函數。但是,整個腳本太慢了,通過打印日誌消息,我調查了它看起來好像它只是在將控制權交給主函數之前「等待」。Perl函數「等待」,然後返回1到主函數

通過查看MySQL的進程列表,我看到一個帶有NULL Info的Sleep進程,只需要計數 - 直到它執行某些操作,Perl函數將不會返回到主函數,儘管Perl腳本本身執行了其命令,一切都成功了。

實施例:

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"; 

的延遲是log2log3之間,並且直到這個時候,有在MySQL的PROCESSLIST睡眠過程。

什麼原因導致這種情況,以及如何提高此腳本的性能?

+1

如果這些打印語句被緩衝,你不能從它們中得出任何結論。打印確切的時間,而不僅僅是消息,並打開autoflush。 – Mat

+0

對不起,我忘了提及,當然我使用localtime()連接到消息,並且使用下面的代碼: 'use IO :: Handle; STDERR-> autoflush(1); STDOUT-> autoflush(1);' – martoncsukas

+0

您能否展示一個實際展現此行爲的最小工作示例?請參閱[SSCCE.org](http://sscce.org/)獲取指導。由於你的代碼目前是,它甚至不會編譯('_SomeFunction'與'SomeFunction',''log2;'和'「log3;'錯過結尾引用)。 – amon

回答

3

Perl不等待範圍退出的任何內容。但退出一個作用域可能導致任意代碼被執行。例如,退出一個範圍可能導致對象變爲未被引用和銷燬,這將涉及調用它們的析構函數。也有other means