【问题标题】:Right Way to Fork in PSGI/Plac application (Perl)在 PSGI/Plac 应用程序中分叉的正确方法 (Perl)
【发布时间】:2013-12-31 01:40:52
【问题描述】:

我有一个这样的问题 - 在 PSGI/Plack 应用程序中分叉的正确方法是什么?

一方面我知道 PSGI 应用程序是“后端不可知的”,因此可以使用不同的方法运行它 - FastCGI、CGI 等 但另一方面我知道,例如在 FastCGI 应用程序中,我们需要在 fork 之前/之后对 FCGI::Request 对象进行一些操作。

那么我必须做什么?

  1. 叉一下 :)
  2. 做一些魔术操作和分叉(什么操作?)
  3. 重写应用架构 => 将所有繁重的操作移至外部守护进程。

【问题讨论】:

    标签: perl fork psgi


    【解决方案1】:

    由于 PSGI 是一种规范,您可以在所有这些情况下使用它。 如果您可以在 mod_perl 中运行 PSGI 应用程序,使用 FastCGI 服务器,作为 CGI,或者您可以在本地 PSGI 服务器(如 plack 等)上运行。

    你如何开始他们显然取决于你选择哪一个。 Mod_perl 由它的 apache 进程决定,CGI 脚本不能从外部启动。但是 FastCGI 和像 Starman 这样的独立 PSGI 服务器往往由反向代理处理,或者手动启动和停止。将它留给代理,PSGI 服务器的配置是最简单的,尽管有时您希望能够独立于代理控制外部进程。

    【讨论】:

    • 哦,我明白,但我在问别的问题是的,我们可以使用各种后端运行 PSGI 应用程序,使用不同的运行处理程序 - FCGI、CGI、嵌入式 PSGI 服务器,如 Starman 等。但我怎么能在我的应用程序中分叉 - 当我不知道我的应用程序在什么环境中运行时,但是这个 current 环境可能需要一些特殊的初始化才能正确分叉?
    • “分叉”您的应用程序由容器处理。对于所有意图,FCGI 流程是您的应用程序,Starman 服务是您的应用程序。它们充当代码的容器,并充当代理和代码之间的接口。例如,如果你选择 Apache/FastCGI,你告诉 apache 有多少个 fastcgi 进程要分叉,以及哪些 URI 传递给 fastcgi 服务器。您无需手动分叉您的应用。
    • 你是完全正确的,但我问的是别的东西 :) 也许我的英语不好是有罪的)我在问我的应用程序中的“手动”分叉。例如 -> app 接收一些请求,并且必须执行一些可能非常耗时的重量级操作。所以我使用 fork() 调用创建子进程并在子进程中运行此操作。关于 IPC、用户在完成后如何获得结果等问题 - 让我们留在幕后。主要问题是这个手动 fork() 调用。
    • 看看 CPAN 上的 IPC 系列模块,它们是高级进程间通信库。
    • 您可以使用一个在“双向管道”上分叉您的流程,以便您的流程可以交互。但是您的整体架构将取决于这些“长”请求的时间长度。您最好将长时间的工作排入队列,然后让一个单独的工作人员来处理队列。但沟通也将取决于。也许这个长作业添加了一个 db 记录,Web 客户端可以在以后查询。
    猜你喜欢
    • 1970-01-01
    • 2014-07-21
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多