6

バックグラウンドで perl サブルーチンを実行する方法はありますか? 私は周りを見回して、スレッドに関していくつかの言及を見てきましたが、例を見るか、正しい方向に私を向けるのに役立ちます. ありがとう。

バックグラウンドで実行run_sleepしたい。

#!/usr/bin/perl

print "Start of script";
run_sleep();
print "End of script";

sub run_sleep {
    select(undef, undef, undef, 5);  #Sleep for 5 seconds then do whatever
}
4

2 に答える 2

10

最も簡単な方法 (IMHO) はfork、サブプロセスを作成し、それで作業を行うことです。Perl スレッドは面倒なので、できる限り避けようとしています。

ここに簡単な例があります

use strict;
use warnings;

print "Start of script\n";
run_sleep();
print "End of script\n";

sub run_sleep { 
    my $pid = fork;
    return if $pid;     # in the parent process
    print "Running child process\n";
    select undef, undef, undef, 5;
    print "Done with child process\n";
    exit;  # end child process
}

これをシェルで実行すると、次のような出力が表示されます。

Start of script
End of script
Running child process

(5 秒待ちます)

Done with child process

親プロセスはすぐに終了し、シェルに戻ります。子プロセスは、その出力を 5 秒後にシェルに送信します。

子プロセスが完了するまで親プロセスを残しておきたい場合は、 を使用できますwaitpid

于 2012-12-18T03:37:46.963 に答える
6

スレッドの使用:

use strict;
use warnings;
use threads;

my $thr = threads->new(\&sub1, "Param 1", "Param 2"); 

sub sub1 { 
  sleep 5;
  print "In the thread:".join(",", @_),"\n"; 
}

for (my $c = 0; $c < 10; $c++) {
  print "$c\n";
  sleep 1;
}

$thr->join();
于 2012-12-18T03:39:07.757 に答える