2009-09-15 108 views
1

我需要像Python一样运行一个服务器端脚本“永远”(或尽可能长时间不丢失状态),以便它们可以保持sockets open,并对接收到的数据等异步事件作出反应。例如,如果我使用Twisted进行套接字通信。永久运行服务器端脚本的方式有哪些?

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

回答

3

如果您正在使用双绞线那么它有用于启动和停止守护程序的整体架构。

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

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

扭很适合这个,阅读上面

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

Twisted是在异步Socket通信非常好。直到你得到它的窍门,它在脑子里很难!

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

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

1

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

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

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

0

我认为Comet是你在找什么。一定要看看龙卷风。

1

您可以使用'双叉'在未绑定到新旧后台进程的新后台进程中运行您的代码。请参阅比如this配方,并提供比您想要的更多解释性评论。

我不会推荐这个作为运行网站后台任务的主要方式。例如,如果你的Python被嵌入到Apache进程中,你会分叉得比你想要的多。最好单独调用守护进程(就在类似的低特权用户下)。

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

你有你的第二叉写守护进程到文件的进程号(PID),然后从文件中读取PID并发送一个终止信号(os.kill(pid, signal.SIG_TERM))。

我困惑吗?

这就是问题!我假设你正试图让一个后台进程在不同的端口上响应Web界面的某种不寻常的网络服务。如果您仅仅是在回应正常的Web请求,那么您就不应该这样做,您应该依靠Apache来处理您的套接字并一次处理一个请求。

0

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

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

一个普遍的问题是:你想要做什么?为什么你需要这个第二个过程,但不知何故由apache控制?为什么不能建立一个与Apache对话的守护进程,为什么它必须由apache控制?