【问题标题】:Perl function "waits" before returning 1 to main functionPerl 函数在将 1 返回到主函数之前“等待”
【发布时间】: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";

延迟在log2log3之间,直到此时,MySQL的进程列表中有一个Sleep进程。

这是什么原因造成的?如何提高此脚本的性能?

【问题讨论】:

  • 如果这些打印语句被缓冲,您无法从它们中得出任何结论。打印出准确的时间,而不仅仅是消息,然后打开自动刷新。
  • 对不起,我忘了说我当然使用 localtime() 连接到消息,以及以下内容:use IO::Handle; STDERR->autoflush(1); STDOUT->autoflush(1);
  • 您能否展示一个实际表现出这种行为的最小工作示例?请参阅SSCCE.org 获取指导。正如您当前的代码一样,它甚至无法编译(_SomeFunction vs SomeFunction"log2;"log3; 错过了结束语)。
  • 抱歉错别字,很遗憾我没有代码。我一般感兴趣的是什么可以阻止函数将控件返回到主函数?
  • 请出示您的 DBI 代码,从原始程序复制而来。

标签: mysql database perl


【解决方案1】:

Perl 不会等待范围退出的任何内容。但是退出作用域会导致任意代码被执行。例如,退出作用域会导致对象变得未引用和销毁,这将涉及调用它们的析构函数。还有other means

【讨论】:

    猜你喜欢
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2021-12-02
    • 2017-05-06
    • 1970-01-01
    相关资源
    最近更新 更多