gpt4 book ai didi

perl - 如何在 Catalyst 应用程序中管理长时间运行的进程?

转载 作者:行者123 更新时间:2023-12-05 00:55:59 26 4
gpt4 key购买 nike

这是我的第一个 Catalyst 应用程序,我不确定如何解决以下问题。

用户在表单中输入一些数据并选择一个文件(最大 100MB)进行上传。提交表单后,实际计算最多需要 5 分钟,结果存储在数据库中。

我想做的是在后台 运行这个过程(也许还有文件上传)以避免服务器超时。应该向用户提供某种反馈(例如消息“作业已开始”或进度条)。当作业仍在运行时,应阻止表单。作业完成后应显示结果页面。

在数小时的阅读中,我偶然发现了异步请求、作业队列、守护进程、Gearman 等概念。 , 或 Catalyst::Plugin::RunAfterRequest .

你会怎么做?感谢您帮助网络开发新手!

PS:在我当前的本地应用程序中,工作是与 Parallel::ForkManager 并行完成的。对于真正的应用程序,是否建议使用像 Amazon EC2 这样的云计算服务?或者只是找一个提供多核服务器的托管商?

最佳答案

不知何故,我无法理解 File::Queue。对于非阻塞并行执行,我最终使用了 TheSchwartz 的组合和 Parallel::Prefork 就像在 Foorum Catalyst App 中实现的那样.基本上,有5个重要元素。也许这个总结会对其他人有所帮助。

1) TheSchwartz DB

2) TheSchwartz 数据库的客户端(数据库句柄)

package MyApp::TheSchwartz::Client;

use TheSchwartz;
sub theschwartz {
my $theschwartz = TheSchwartz->new(
databases => [ {
dsn => 'dbi:mysql:theschwartz',
user => 'user',
pass => 'pass',
} ],
verbose => 1,
);
return $theschwartz;
}

3) 工作人员(实际工作完成的地方)

package MyApp::TheSchwartz::Worker::Test;

use base qw( TheSchwartz::Moosified::Worker );
use MyApp::Model::DB; # Catalyst DB connect_info
use MyApp::Schema; # Catalyst DB schema

sub work {
my $class = shift;
my $job = shift;
my ($args) = $job->arg;
my ($arg1, $arg2) = @$args;

# re-use Catalyst DB schema
my $connect_info = MyApp::Model::DB->config->{connect_info};
my $schema = MyApp::Schema->connect($connect_info);

# do the heavy lifting

$job->completed();
}

4) 工作进程 TheSchwartzWorker.pl 不间断地监视表job

use MyApp::TheSchwartz::Client qw/theschwartz/;    # db connection
use MyApp::TheSchwartz::Worker::Test;
use Parallel::Prefork;

my $client = theschwartz();

my $pm = Parallel::Prefork->new({
max_workers => 16,
trap_signals => {
TERM => 'TERM',
HUP => 'TERM',
USR1 => undef,
}
});

while ($pm->signal_received ne 'TERM') {
$pm->start and next;

$client->can_do('MyApp::TheSchwartz::Worker::Test');
my $delay = 10; # When no job is available, the working process will sleep for $delay seconds
$client->work( $delay );

$pm->finish;
}
$pm->wait_all_children();

5) 在 Catalyst Controller 中:将一个新作业插入表 job 并传递一些参数

use MyApp::TheSchwartz::Client qw/theschwartz/;
sub start : Chained('base') PathPart('start') Args(0) {
my ($self, $c ) = @_;

$client = theschwartz();
$client->insert(‘MyApp::TheSchwartz::Worker::Test’, [ $arg1, $arg2 ]);

$c->response->redirect(
$c->uri_for(
$self->action_for('archive'),
{mid => $c->set_status_msg("Run '$name' started")}
)
);
}

新运行在“存档”页面上显示为灰色,直到所有结果都在数据库中可用。

关于perl - 如何在 Catalyst 应用程序中管理长时间运行的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41742950/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com