Thread::Suspend
を使用して、リモートモジュールからスレッドを開始しています。 $subrotine
コールの中には、30秒を超えるものがあります。Perlスレッドは中断/再開しません。
my $thr = threads->create(sub {
capture(EXIT_ANY, $^X, $pathToModule, $subroutine, %arguments)
});
return $thr->tid();
私の問題は、作成したスレッドを中断/再開できないことです。
use IPC::System::Simple qw (capture $EXITVAL EXIT_ANY);
use threads;
use Thread::Suspend;
use Try::Tiny;
sub suspendThread {
my $msg;
my $threadNumber = shift;
foreach (threads->list()) {
if ($_->tid() == $threadNumber) {
if ($_->is_suspended() == 0) {
try {
# here the execution of the thread is not paused
threads->suspend($_);
} catch {
print "error: " . $! . "\n";
};
$msg = "Process $threadNumber paused";
} else {
$msg = "Process $threadNumber has to be resumed\n";
}
}
}
return $msg;
}
そして、これは私が動的にロードモジュールからのコードです:
sub run {
no strict 'refs';
my $funcRef = shift;
my %paramsRef = @_;
print &$funcRef(%paramsRef);
}
run(@ARGV);
私は問題はsub
がトレッドに渡されるということであることを推測ここでは、コードのスレッドを中断するために実行されますコンストラクタはキャプチャを呼び出します(IPC::System::Simple
モジュールから)。私もmy $thr = threads->create(capture(EXIT_ANY, $^X, $pathToModule, $subroutine, %arguments));
とスレッドを作成しようとしました。どのようにそれを解決するためのアイデア。
あなたは何を達成しようとしていますか?なぜ単に使用しないのですか?スレッドを一時停止するセマフォーや他のIPC? – Sobrique
「作成されたスレッドを中断/再開できない」ときはどうなりますか? _error_が印刷されていますか? '$ msg'とは何ですか? 'capture()'は少なくとも1つの子プロセスを作成するので、親プロセスのスレッドを子プロセスに保留することはどのような効果が期待されますか? – pilcrow
ヒント: '$ _-> suspend()'は 'threads-> suspend($ _)'よりもはるかに奇妙に見えます。 – ikegami