Perl поток умирает после отсоединения - PullRequest
0 голосов
/ 20 марта 2012

Мне нужно создать поток и позволить ему делать некоторые вещи. Основная причина - выйти из основной программы как можно быстрее. Но после того, как я отсоединяю поток и завершаю основную программу, поток умирает. В моем примере файл не содержит ожидаемых данных. Если я оставлю основную программу в спящем режиме на 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 ]

3 голосов
/ 20 марта 2012

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

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

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

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

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

1 голос
/ 20 марта 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...