我需要创建一个线程并让它做一些事情。主要原因是尽快退出主程序。 但是在我分离线程并结束主程序之后,线程就死掉了。在我的示例中,该文件不包含预期的数据。 如果我让主程序睡眠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;
}
答案 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";
}
我认为这不是一个非常好的方法,因为你现在已经失去了对子进程的控制权。为什么不直接运行它来处理这个过程呢?
编辑:这当然也有可能产生僵尸进程,这会占用系统资源。和大脑。