2012-03-20 4 views
0

Мне нужно создать поток и позволить ему делать что-то. Основная причина заключается в том, чтобы как можно быстрее выйти из основной программы. Но после того, как я отсоединяю нить и заканчиваю основную программу, нить умирает. В моем примере файл не содержит ожидаемых данных. Если я позволяю основной программе спать в течение 5 секунд, все работает нормально.perl thread умирает после отсоединения

Как я могу запустить поток после выхода из основной проги?

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; 
} 

ответ

3

Проще говоря, вы не можете.

  • $thr->detach()
    Делает нить несоединимое, и вызывает любое возможное значение, возвращаемое, чтобы выбросить. Когда программа выходит из, любые отсоединенные потоки, которые все еще работают, молча завершены.

Но вы могли бы сделать:

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

Но вряд ли покупает вам много. Поскольку потоки в основном предназначены для использования другими вещами, в то время как вы продолжаете что-то делать. Существует мало оснований останавливать основную линию исполнения, а затем запускать поток, когда вы могли бы так же хорошо позвонить sub1();

+0

Благодарим вас за быстрый ответ. Я думаю, что в моем случае я должен использовать что-то ilke system («prg_name.pl &»). – shipik

1

Вы не можете использовать потоки, дочерний процесс до конца:

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"; 
} 

Я не думаю, что это не очень хороший подход, поскольку теперь вы потеряли контроль над процессом ребенка. Почему бы просто не запустить его основной и фоновый процесс?

Редактировать: Это, конечно же, также может генерировать процессы зомби, которые будут потреблять системные ресурсы. и мозги.

+1

Я не хочу производить зомби :-). Я просто попытался выполнить фоновый процесс с помощью системы («prg_name.pl &»). И это работает, но в моем случае это немного неряшливое решение. – shipik

Смежные вопросы