剥离后perl线程死亡

时间:2012-03-20 12:11:58

标签: multithreading perl asynchronous

我需要创建一个线程并让它做一些事情。主要原因是尽快退出主程序。 但是在我分离线程并结束主程序之后,线程就死掉了。在我的示例中,该文件不包含预期的数据。 如果我让主程序睡眠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;
}

2 个答案:

答案 0 :(得分:3)

很简单,你做不到。

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

但你可以这样做:

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

但这很难买到你。因为线程主要用于做其他事情,而你继续做一些事情。没有理由停止执行主线,然后运行一个线程,当你可以调用sub1();

答案 1 :(得分:1)

你不能使用线程,但你可以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";
}

我认为这不是一个非常好的方法,因为你现在已经失去了对子进程的控制权。为什么不直接运行它来处理这个过程呢?

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