永远运行服务器端脚本的方法是什么?

时间:2009-09-15 12:51:00

标签: python apache sockets webserver twisted

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

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

5 个答案:

答案 0 :(得分:3)

如果你使用twisted,那么它有一个完整的基础设施来启动和停止守护进程。

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

  

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

Twisted适用于此,请阅读上面的链接

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

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

  

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

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

答案 1 :(得分:1)

你可以编写一个连续在一个块中等待连接发生的脚本,并等待一个信号关闭它。

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

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

答案 2 :(得分:1)

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

我不建议将此作为运行网站后台任务的主要方式。例如,如果您的Python嵌入在Apache进程中,那么您将获得比您想要的更多的东西。最好单独调用守护进程(仅在类似的低权限用户下)。

  

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

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

  

我感到困惑吗?

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

答案 3 :(得分:0)

我认为Comet正是您所寻找的。一定要看看龙卷风。

答案 4 :(得分:0)

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

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

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