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

0xD*_*EEF 1 perl multithreading poe

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

该程序包括一个运行编译作业的进程,另一个正在查看日志,以及主循环等待.

全球范围:

my $Pass = 0;
my $Done = 0;
Run Code Online (Sandbox Code Playgroud)

然后开始监控:

threads->create(\&StartWatcher);
Run Code Online (Sandbox Code Playgroud)

watch-log文件sub的位置如下所示:

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();
}
Run Code Online (Sandbox Code Playgroud)

$ 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;
    }
Run Code Online (Sandbox Code Playgroud)

产生的输出类似于:

POE InputEvent Pass: 1, Done: 1
Compiling... [0/91]  Pass: 0  Failed: 0                           
Run Code Online (Sandbox Code Playgroud)

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

出了什么问题?

any*_*dot 5

perl中的线程与其他语言的工作方式不同,程序空间不共享.在线程创建中,当前线程被复制到新线程中,该线程与父线程分离(每个线程都有自己的perl解释实例).如果要在线程之间进行通信,请查看threads :: shared,Thread :: Queue和Thread :: Semaphore.