0

前言

我正在编写一个网络服务器,让用户可以访问一些用 C 编写的程序(我在这个 C 程序上使用 Python 包装器,它是PyCLIPS)。为了服务很多用户,web-server 必须启动这个 C 程序的很多副本,因为一个副本可以同时服务很少的用户,大约 1-3 个用户。此外,每个用户都应该只使用他自己的副本,因此应该有很多 C 程序的副本。

这个 C 程序是一个CLIPS 引擎,如果它有助于理解的话。


所以,为了解决这个设计问题,我想写一个 Twisted TCP 服务器,它就像一个长时间运行的进程池。每个长时间运行的进程都是一个小型 Twisted TCP 服务器,它可以访问 C 程序的一个副本。

例如,用户要求池服务器为他保留一个长时间运行的进程,然后池服务器创建并运行一个开始监听某个端口的长时间运行的进程,然后池服务器返回主机并将这个长期运行的进程移植到用户。现在,用户可以直接与这个长时间运行的进程进行通信。


问题

  1. 如何从池服务器启动这些长时间运行的进程?池服务器和每个长时间运行的进程应该是单独的 Twisted 服务器。
  2. Twisted 是实现这些目标的好选择吗?
  3. 也许还有其他方法可以解决这个设计问题?

非常感谢。

4

1 回答 1

4

为此使用 Twisted 听起来很有意义。在 Twisted 中支持运行进程的低级 API 是reactor.spawnProcess流程howto文档中给出了它的一些用法示例。

该 API 非常适合处理许多长时间运行的进程,并且与 Twisted 中的所有 I/O API 一样,它在与另一个事件源结合使用时效果很好,例如用户可以用来请求启动新进程的 Web 服务器。

reactor.spawnProcess更像是标准库子进程模块而不是multiprocessing包。它为您提供了一种启动子进程的方法,该子进程运行特定的可执行文件,带有特定的参数等。它不提供用于在另一个进程中运行特定 Python 函数的高级 API。但是,构建这样的东西并不难(至少对于特定情况)。考虑这种方法:

from sys import executable
from os import environ

from twisted.internet import reactor

implementation = """\
from yourapp import somefunction
somefunction()
"""

reactor.spawnProcess(executable, [executable, "-c", implementation], env=environ)
reactor.run()

这只是启动一个新的 Python 解释器(无论您碰巧在运行哪个),并使用 -c 选项在命令行上指定一个程序以使其运行。

于 2011-08-27T15:07:38.193 回答