【发布时间】:2013-12-08 12:13:06
【问题描述】:
我有一个 Perl 脚本,它调用几个从主函数执行 MySQL 数据库任务的函数。但是,整个脚本太慢了,通过打印日志消息,我调查它看起来好像只是在将控制权交还给主函数之前“等待”。
通过查看 MySQL 的进程列表,我看到一个带有 NULL 信息的 Sleep 进程正在计数 - 直到它正在做某事,Perl 函数不会返回到 main 函数,尽管 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";
延迟在log2和log3之间,直到此时,MySQL的进程列表中有一个Sleep进程。
这是什么原因造成的?如何提高此脚本的性能?
【问题讨论】:
-
如果这些打印语句被缓冲,您无法从它们中得出任何结论。打印出准确的时间,而不仅仅是消息,然后打开自动刷新。
-
对不起,我忘了说我当然使用 localtime() 连接到消息,以及以下内容:
use IO::Handle; STDERR->autoflush(1); STDOUT->autoflush(1); -
您能否展示一个实际表现出这种行为的最小工作示例?请参阅SSCCE.org 获取指导。正如您当前的代码一样,它甚至无法编译(
_SomeFunctionvsSomeFunction、"log2;和"log3;错过了结束语)。 -
抱歉错别字,很遗憾我没有代码。我一般感兴趣的是什么可以阻止函数将控件返回到主函数?
-
请出示您的 DBI 代码,从原始程序复制而来。