gpt4 book ai didi

queue - (Laravel 5) 监控并可选地取消队列中已经运行的作业

转载 作者:行者123 更新时间:2023-12-04 17:35:24 25 4
gpt4 key购买 nike

我需要实现监控和取消队列中已经在运行的作业的能力。

有很多关于删除 QUEUED 作业的答案,但没有针对已经运行的作业。

情况是这样的:我有一份“工作”,它由数据库中的数十万行组成,需要针对 Web 服务逐一查询。

需要提取每一行,针对 Web 服务进行查询,存储响应并更新其状态。

我已经将其用作命令(从控制台启动/输出到控制台),但现在我需要实现队列以允许从更多用户那里堆积更多作业。

到目前为止,我已经看到了 Horizo​​n(由于缺少进程控制库,它无法在 Windows 上运行)。然而,在周围看到的一些演示中,它缺少(我相信)我需要的一些东西:

  • 可动态配置的超时(整个作业可能需要 12 小时以上,具体取决于所选作业要处理的行数)
  • 能够取消已经在运行的作业。

我还考虑了将 EACH REQUEST 生成为新作业的选项,而不是将“作业”视为整个行集合(这将克服超时问题),但这会给我一个地平线“待处理作业”列表每个作业数十万条记录,这会杀死浏览器(我知道 Redis 可以毫不费力地处理这个问题)。此外,我猜不可能取消“属于 X 标签的所有作业”。

我一直在考虑使用 API 路由、启 Action 业并将其与应用分离,但我发现这需要 fork 流程。

为了能够取消,我将实现一个带有 job_id 的数据库,当用户点击 API 取消作业时,我会将其标记为“已暂停”。在每个循环中,我都会检查它的状态,如果它发现“已停止”,则会自行终止。

如果我遗漏了任何方面,请大声疾呼,我会添加或澄清。

所以我在这里寻求建议,因为我是 Laravel 的新手:我怎样才能做到这一点?

最佳答案

所以我终于想出了这个(有点笨拙)的解决方案:

在 Controller 中:

 public function cancelJob()
{
$jobs = DB::table('jobs')->get();

# I could use a specific ID and user owner filter, etc.
foreach ($jobs as $job) {
DB::table('jobs')->delete($job->id);
}

# This is a file that... well, it's self explaining
touch(base_path(config('files.halt_process_signal')));

return "Job cancelled - It will stop soon";
}

在作业类中(在 model::chunk() 函数内)

                # CHECK FOR HALT SIGNAL AND [OPTIONALLY] STOP THE PROCESS
if ($this->service->shouldHaltProcess()) {

# build stats, do some cleanup, log, etc...

$this->halted = true;
$this->service->stopProcess();

# This FALSE is what it makes the chunk() method to stop looping
return false;
}

在服务类中:

    /**
* Checks the existence of the 'Halt Process Signal' file
*
* @return bool
*/
public function shouldHaltProcess() :bool
{
return file_exists($this->config['files.halt_process_signal']);
}


/**
* Stop the batch process
*
* @return void
*/
public function stopProcess() :void
{
logger()->info("=== HALT PROCESS SIGNAL FOUND - STOPPING THE PROCESS ===");
$this->deleteHaltProcessSignalFile();

return ;
}

它看起来不太优雅,但它确实有效。我浏览了整个网络,很多人选择了 Horizo​​n 或其他不适合我的工具。如果谁有更好的实现方式,欢迎分享。

关于queue - (Laravel 5) 监控并可选地取消队列中已经运行的作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56860668/

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