【问题标题】:What are the ways to run a server side script forever?永久运行服务器端脚本的方法是什么?
【发布时间】:2009-09-16 15:36:21
【问题描述】:

我需要“永远”运行像 Python 这样的服务器端脚本(或者尽可能长时间地运行而不丢失状态),这样他们就可以保持sockets open 并对接收到的数据等事​​件做出异步反应。例如,如果我使用Twisted 进行套接字通信。

  • 我将如何管理这样的事情?
  • 我感到困惑吗?还是有更好的方法来实现异步套接字通信?
  • 通过 Apache 服务器启动脚本一次后,如何停止运行?

【问题讨论】:

    标签: python apache sockets webserver twisted


    【解决方案1】:

    如果您使用的是 twisted,那么它具有用于启动和停止守护进程的完整基础架构。

    http://twistedmatrix.com/projects/core/documentation/howto/application.html

    我将如何管理这样的事情?

    Twisted 很适合这个,阅读上面的链接

    我很困惑吗?还是有更好的方法来实现异步套接字通信?

    Twisted 非常擅长异步套接字通信。在你掌握它之前,这对大脑来说很难!

    通过 Apache 服务器启动脚本一次后,如何停止运行?

    扭曲的工具假定命令行访问,所以如果我理解你想要做什么,你必须编写一个 cgi 包装器来启动/停止它们。

    【讨论】:

      【解决方案2】:

      您可以只编写一个脚本,在一段时间内连续等待连接发生并等待信号关闭它。

      http://docs.python.org/library/signal.html

      然后要停止它,您只需要运行另一个向他发送该信号的脚本。

      【讨论】:

        【解决方案3】:

        您可以使用“双叉”在未绑定到旧后台进程的新后台进程中运行您的代码。请参阅例如 this recipe,其中包含比您可能想要的更多解释性 cmets。

        我不建议将此作为为网站运行后台任务的主要方式。例如,如果您的 Python 嵌入在 Apache 进程中,那么您的分叉将超出您的预期。最好单独调用守护进程(就在类似的低权限用户下)。

        通过 Apache 服务器启动脚本一次后,如何停止运行?

        您让您的第二个 fork 将守护进程的进程号 (pid) 写入文件,然后从该文件中读取 pid 并向其发送终止信号 (os.kill(pid, signal.SIG_TERM))。

        我很困惑吗?

        这就是问题!我假设您正在尝试拥有一个后台进程,该进程在不同的端口上响应 Web 界面以获取某种不寻常的网络服务。如果您只是谈论响应正常的 Web 请求,您不应该这样做,您应该依靠 Apache 来处理您的套接字并一次处理一个请求。

        【讨论】:

          【解决方案4】:

          我认为Comet 是您正在寻找的。一定要看看 Tornado。

          【讨论】:

            【解决方案5】:

            您可能想查看 FastCGI,它听起来与您正在寻找的完全一样,但我不确定它是否正在开发中。它使用一个 CGI 守护进程和一个特殊的 apache 模块与之通信。由于守护程序长时间运行,因此您没有 fork/exec 成本。但作为管理您自己资源的成本(不会对每个请求进行自动清理)

            这种风格的 FastCGI 不再被使用的一个原因是有一些方法可以将解释器嵌入到 Apache 二进制文件中并让它们在服务器中运行。我不熟悉 mod_python,但我知道 mod_perl 具有允许长时间运行的进程的配置。这里要小心,因为服务器中长时间运行的进程会导致资源泄漏。

            一个普遍的问题是:你想做什么?为什么你需要第二个进程,却又以某种方式被 apache 控制?为什么你不能只建立一个与apache对话的守护进程,为什么它必须由apache控制?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-10-02
              • 2015-01-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多