【问题标题】:Running perl function in background or separate process在后台或单独进程中运行 perl 函数
【发布时间】:2013-01-25 18:30:26
【问题描述】:

我在兜圈子。我有创建一个巨大文件的网页。该文件需要永远创建,并且位于子程序中。

我的页面运行此子例程但不等待它被创建/处理的最佳方式是什么?自从我从网页上执行此操作后,apache 进程是否存在任何问题?

【问题讨论】:

  • 你能在子例程中 fork 一个子进程来创建文件吗?
  • 我已经尝试过了,它在 50% 的时间内都有效。不知道为什么会失败以及是否有更好的解决方案。

标签: perl apache process background-process


【解决方案1】:

执行此任务的最简单方法是简单地使用fork() 并让长时间运行的子例程在子进程中运行。同时,让父级返回 Apache。您表示您已经尝试过,但缺少有关代码的确切外观和失败原因的更多信息,很难帮助您在这条道路上前进。

另一种选择是运行一个单独的进程来负责管理长时间运行的任务。让网页使用本地套接字(或通过创建包含必要输入数据的文件)将工作单元发送到长时间运行的进程,然后您的 Web 脚本可以立即返回,而单独的进程负责完成长时间运行任务。

这种解耦执行的方法相当普遍,通常被称为“任务队列”(如果有一些机制可以在请求进入时对它们进行排队)。有许多工具可以帮助您设计这种解决方案(但对于基于文件系统的通信的简单情况,没有它们可能会很好)。

【讨论】:

  • fork 时,确保子进程关闭 STDIN、STDOUT 和 STDERR。否则,他们仍然会连接到网络服务器,它不会实现关闭连接。
【解决方案2】:

我认为你想创建一个 Apache 的工人孙子——即:

Apache -> child -> grandchild

孩子在分叉孙子后立即死亡,孙子关闭 STDIN、STDOUT 和 STDERR。 (然后孙子创建文件。)这些是创建僵尸守护程序(与网络服务器未连接的无父工作进程)的基本步骤。

【讨论】:

    猜你喜欢
    • 2012-10-20
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2023-03-10
    • 2021-04-06
    相关资源
    最近更新 更多