gpt4 book ai didi

multithreading - 在不修改全局变量的线程中运行的Perl POE::Wheel::FollowTail

转载 作者:行者123 更新时间:2023-12-03 13:16:21 25 4
gpt4 key购买 nike

在此程序中,POE::Wheel::FollowTail可以很好地跟踪文件尾部,它还在单独的线程中运行,以仅监视编译作业的进度。
在InputEvent处理程序中,有一个粗略的正则表达式可提取编译结果,并且一切正常,但是我无法在此子类之外获取任何可访问的结果值。即使我将结果变量放在全局范围内,它们也不会被修改。

该程序由一个运行编译作业的进程,另一个监视日志和等待主循环的进程组成。

全局范围:

my $Pass = 0;
my $Done = 0;

然后开始监视:
threads->create(\&StartWatcher);

监视日志文件 subview 如下所示:
sub StartWatcher
{
my $logfile = "filename.log";

# Create the logfile watcher
POE::Session->create
(
inline_states =>
{
_start => sub
{
$_[HEAP]{tailor} = POE::Wheel::FollowTail->new( Filename => $logfile, InputEvent => "got_log_line", );
},
got_log_line => sub
{
$Pass += () = $_[ARG0] =~ /^\d+.*vcproj \- 0 error\(s\), \d+ warning\(s\)/g;
$Done += () = $_[ARG0] =~ /^\d+.*vcproj \- \d+ error\(s\), \d+ warning\(s\)/g;
print "POE InputEvent Pass: $Pass, Done: $Done\n"; # Debug output
},
}
);

POE::Kernel->run();
}

$ logfile由使用Win32::Process::Create开始的Visual Studio编译作业编写,并且主要的Perl执行位于该循环中,等待编译器终止,并每秒产生一个状态输出。
    while('true')
{
$ProcessObj->Wait(100); # milliseconds wait
$ProcessObj->GetExitCode($exitcode);
if ( $exitcode == STILL_ACTIVE )
{
"Compiling... [$Done/$Count] Pass: $Pass Failed: $failed"
if($RunCounter++ % 10 == 0);
next;
}
last;
}

产生的输出类似于以下内容:
POE InputEvent Pass: 1, Done: 1
Compiling... [0/91] Pass: 0 Failed: 0

IE。在InputEvent处理程序got_log_line中,两个全局变量已增加,但在Perl主循环中,它们仍为零。我意识到我可以从InputEvent处理程序执行打印输出,但是为什么不修改全局变量呢?

怎么了?

最佳答案

Perl中的线程无法以与其他语言相同的方式工作,程序空间不会共享。在线程创建中,当前线程被复制到新线程中,新线程与父线程分离(每个线程都有它自己的perl解释指令)。如果要在线程之间进行通信,请查看thread::shared,Thread::Queue和Thread::Semaphore。

关于multithreading - 在不修改全局变量的线程中运行的Perl POE::Wheel::FollowTail,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6437792/

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