我使用Event
var监视器来实现内部队列。当生产者线程向队列中添加内容(只是一个数组)时,它将改变一个被监视变量的值,以表明添加了一个元素。
如何对AnyEvent
做同样的事情?它似乎不支持变量观看。我是否必须使用管道并使用IO监视器(即生产者在添加元素时在管道的一端写入一个字节)
我也有兴趣知道如何做到这与Coro
。
听起来好像您正在使用变量监视作为将控制权转移回消费者的手段。在AnyEvent中,这可以通过从生产者调用$cv->send()和在消费者调用$cv->recv()来完成条件变量。您可以考虑将原本放在队列中的项目发送给send(),但是不带参数地调用send应该是通知消费者的一种允许的方式。
我找到了要使用的范例:
my @queue;
my $queue_watcher;
sub add_item {
push(@queue, $_[0]);
$queue_watcher ||= AnyEvent->timer(after => 0, cb => &process_queue);
}
sub process_queue {
... # remove zero or more elements from @queue
if (@queue) {
$queue_watcher = AnyEvent->timer(after => 0, cb => &process_queue);
} else {
undef $queue_watcher;
}
}
当且仅当@queue
不为空时,$queue_watcher
被定义并激活。