gpt4 book ai didi

multithreading - 从 perl 线程生成 Expect

转载 作者:行者123 更新时间:2023-12-01 04:48:49 24 4
gpt4 key购买 nike

我正在编写一个脚本,它需要定期(每 5 分钟)生成一个 Expect 进程来完成一些工作。下面是我拥有的代码,它产生了一个 Expect 进程并做了一些工作。脚本的主要进程一直在做一些其他的工作,例如它可能会等待用户输入,因此我在一个每 5 分钟不断调用它的线程中调用这个函数“spawn_expect”,但问题是预期未按预期工作。

但是,如果我用另一个进程替换线程,也就是说,如果我 fork 并让一个进程负责生成 Expect 并且另一个进程执行脚本的主要工作(例如在提示下等待),那么 Expect 工作正常。

我的问题是是否有可能有一个线程产生 Expect 进程?我是否必须求助于使用流程来完成这项工作?谢谢 !

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

最佳答案

创建 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不过为了这份工作。

关于multithreading - 从 perl 线程生成 Expect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43874794/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com