我使用Mojo::IOLoop
来执行应该经常运行的后台任务,并使用Mojo::IOLoop::recurring
执行此操作。我在Mojo应用程序中执行此操作:
sub startup {
my $self = shift;
$self->setup_routes();
... more setup
my $sleep_time = $self->config()->{sleep_time};
Mojo::IOLoop->recurring($sleep_time => sub {
my $sync = My::BackgroundTask->new(
sleep_time => $sleep_time,
);
$sync->run();
});
local $SIG{TERM} = sub {
Mojo::IOLoop->stop_gracefully;
};
}
当上述循环开始运行时,当尝试查看实际应用时,网站会超时,并且当它完成时,应用程序再次可用。不知道为什么会这样,有人能解释一下吗?
编辑:
My::BackgroundTask::run
sub run {
my ($self, $data) = @_;
while ( scalar(@{$data}) > 0 ) {
my @batch = splice(@{$data}, 0, 100);
$self->schema->update_batch_of_data( \@batch );
# sleep for a while to not be rude :P
sleep ($self->sleep_time);
}
return 1;
}
答案 0 :(得分:0)
你是说它睡了$sleep_time
秒?因为这不是它应该如何工作的。它应退出并在下次recurring
启动时继续该过程。实际上,每次recurring
启动时,您都会尝试启动该任务任务的另一个副本,也许您的任务正在挂起,因为它无法启动多个任务?只是一个猜测,它是否从$sync->run()
返回?什么是$sync
?
- 鲍罗廷
是的,你需要一个类似的recurring
计时器,但每一步只做一小部分工作
- 鲍罗廷