在尝试理解 AnyEvent 时,我创建了两个计时器,每次触发时都会打印到屏幕上。最初两者都不起作用。但是按照Joshua Barratt 的计时器示例,我发现如果我没有undef
计时器的观察者变量,那么计时器的回调根本不会触发。为什么会这样?我怀疑它与 perl 和/或 AnyEvent 中范围的工作方式有关。
这是我的示例程序:
#!/usr/bin/perl
use AE;
my $cv = AE::cv;
sub func1 {
my $spoke = 0;
my $t1; $t1 = AE::timer 0, 1,
sub {
print "Timer 1 Fired\n";
if($spoke++ > 5) {
print "Timer 1 Done\n";
undef $t1;
}
};
print "Timer 1 started\n";
}
sub func2 {
my $spoke = 0;
my $t2; $t2 = AE::timer 0, 1,
sub {
print "Timer 2 Fired\n";
if($spoke++ > 5) {
print "Timer 2 Done\n";
#undef $t2;
}
};
print "Timer 2 started\n";
}
func1();
func2();
$cv->recv;
照原样,我的代码返回:
Timer 1 started
Timer 2 started
Timer 1 Fired
Timer 1 Fired
Timer 1 Fired
Timer 1 Fired
Timer 1 Fired
Timer 1 Fired
Timer 1 Fired
Timer 1 Done
如果我取消注释该undef $t2;
行,定时器 2 的回调被触发,我得到这个:
Timer 1 started
Timer 2 started
Timer 1 Fired
Timer 2 Fired
Timer 2 Fired
Timer 1 Fired
Timer 1 Fired
Timer 2 Fired
Timer 2 Fired
Timer 1 Fired
Timer 1 Fired
Timer 2 Fired
Timer 2 Fired
Timer 1 Fired
Timer 1 Fired
Timer 1 Done
Timer 2 Fired
Timer 2 Done