菌种从一个Perl线程期待

问题描述 投票:4回答:1

我工作的一个需要定期产卵的期待过程(每5分钟)做一些工作的脚本。下面是我有一个派生期待过程,做了一些工作的代码。该脚本的主要过程是做一些其他的工作,在任何时候,例如,它可以等待用户输入,因为,我调用线程此功能“spawn_expect”那不断调用它每隔5分钟,但问题是该预计不会按预期工作。

然而,如果我与另一个进程替换线程,也就是说,如果我叉,让一个进程照顾产卵的期待和其它过程将执行脚本的主要工作(例如,在提示等待),那么预计正常工作。

我的问题是有可能有一个线程产卵期待的过程?我不得不求助于使用过程中做这项工作?谢谢 !

sub spawn_expect {
    my $expect = Expect->spawn($release_config{kinit_exec});
    my $position = $expect->expect(10,
                    [qr/Password.*: /, sub {my $fh = shift; print $fh "password\n";}],
                    [timeout => sub {print "Timed out";}]);
    # if this function is run via a process, $position is defined, if it is run via a thread, it is not defined                         
    ...
 }
multithreading perl expect.pm
1个回答
1
投票

创建Expect对象beforehand(不是线程内),并把它传递给一个线程

my $exp = Expect->spawn( ... );
$exp->raw_pty(1);
$exp->log_stdout(0);

my ($thr) = threads->create(\&login, $exp);
my @res = $thr->join();    
# ...

sub login {
    my $exp = shift;
    my $position = $exp->expect( ... );
    # ...
}

我有多个线程,其中一个使用Expect使用自定义的测试脚本,并返回脚本的输出到主线程测试。让我知道我是否应该发布这些(短)的方案。

当一个线程中创建Expect对象失败对我来说,太。我的猜测是,在这种情况下,它不能设立PTY它通常的方式。

鉴于澄清评论我会使用fork作业虽然。

© www.soinside.com 2019 - 2024. All rights reserved.