Mojo IOLoop在跑步时会阻止app

时间:2015-12-16 16:08:27

标签: perl mojolicious

我使用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;
}

1 个答案:

答案 0 :(得分:0)

你是说它睡了$sleep_time秒?因为这不是它应该如何工作的。它应退出并在下次recurring启动时继续该过程。实际上,每次recurring启动时,您都会尝试启动该任务任务的另一个副本,也许您的任务正在挂起,因为它无法启动多个任务?只是一个猜测,它是否从$sync->run()返回?什么是$sync?                      - 鲍罗廷

是的,似乎是因为中间的睡眠,谢谢!有关如何在呼叫外部资源时如何友好而不是一次性挤奶的建议吗? :P - a7omiton

是的,你需要一个类似的recurring计时器,但每一步只做一小部分工作                      - 鲍罗廷

相关问题