【问题标题】:perl thread dies after detachperl 线程在分离后死亡
【发布时间】:2012-03-20 12:11:58
【问题描述】:

我需要创建一个线程并让它做一些事情。主要原因是尽快退出主程序。 但是在我分离线程并结束主程序后,线程就死了。在我的示例中,该文件不包含预期数据。 如果我让主程序休眠 5 秒,一切正常。

从主程序退出后如何让线程运行?

use threads;
print "Starting main program\n";
my $t = threads->new(\&sub1)->detach();
print "End of main program\n";

sub sub1 {
        print "started thread\n";

        open (FILE, ">>./test.txt") or die($!);
        print FILE localtime(time())."\n";
        foreach (1..3){
          print FILE "$_\n";
          sleep 1;
        }
        close(FILE);
         return 1;
}

【问题讨论】:

    标签: multithreading perl asynchronous


    【解决方案1】:

    很简单,你不能。

    • $thr->detach()
      使线程不可连接,并导致丢弃任何最终返回值。当程序退出时,任何仍在运行的分离线程都将被静默终止

    但你可以这样做:

    threads->new(\&sub1)->join();
    

    但这很难让你买多少。因为线程主要用于在您继续做某事的同时做其他事情。几乎没有理由停止执行主线,然后运行一个线程,而您也可以调用 sub1();

    【讨论】:

    • 感谢您的及时答复。我认为就我而言,我必须使用类似系统(“prg_name.pl &”)的东西。
    【解决方案2】:

    你不能使用线程,但你可以 fork 并让父进程退出而不等待子进程完成:

    my $pid = fork();
    if ($pid == 0) {
      print "child proc\n";
      sleep 5;
      print "child, 5 seconds older\n";
      exit(0);
    } else {
      print "parent proc. goodbye\n";
    }
    

    我认为这不是一个很好的方法,因为您现在已经失去了对子进程的控制。为什么不直接运行它并在后台运行它?

    编辑:这当然也有可能产生僵尸进程,这会消耗系统资源。和大脑。

    【讨论】:

    • 我不想生产僵尸:-)。我只是尝试使用 system("prg_name.pl &") 进行后台处理。它有效,但在我的情况下有点邋遢的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    相关资源
    最近更新 更多