1

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

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

5 回答 5

3

If you are using twisted then it has a whole infrastructure for starting and stopping daemons.

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

How would I manage something like this?

Twisted works well for this, read the link above

Am I confused? or are there are better ways to implement asynchronous socket communication?

Twisted is very good at asynchronous socket communications. It is hard on the brain until you get the hang of it though!

After starting the script once via Apache server, how do I stop it running?

The twisted tools assume command line access, so you'd have to write a cgi wrapper for starting / stopping them if I understand what you want to do.

于 2009-09-16T07:36:21.023 回答
1

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

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

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

于 2009-09-15T13:08:09.367 回答
1

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

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

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

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

我很困惑吗?

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

于 2009-09-15T13:17:21.483 回答
0

我认为彗星是你要找的。一定要看看龙卷风。

于 2009-09-15T13:09:04.140 回答
0

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

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

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

于 2009-09-15T21:38:08.713 回答