前言
我正在编写一个web服务器,它允许用户访问一些用C编写的程序(我在这个C程序上使用Python包装器,它是PyCLIPS(。为了服务于大量用户,web服务器必须启动该C程序的大量副本,因为一个副本可以同时服务于极少数用户,大约1-3个用户。此外,每个用户应该只使用自己的副本,因此应该有很多C程序的副本。
如果这个C程序有助于理解的话,它就是一个CLIPS引擎
所以,为了解决这个设计问题,我想写一个Twisted TCP服务器,它就像一个长时间运行的进程池。每个长时间运行的进程都是一个小型的TwistedTCP服务器,可以访问C程序的一个副本。
例如,一个用户要求池服务器为他保留一个长时间运行的进程,然后池服务器创建并运行一个开始侦听某个端口的长时间运行进程,然后该池服务器将该长时间运行过程的主机和端口返回给用户。现在,用户可以直接与这个长时间运行的进程进行通信。
问题
- 如何从池服务器启动这些长时间运行的进程?池服务器和每个长时间运行的进程都应该是独立的Twisted服务器
- Twisted是实现这些目标的好选择吗
- 也许还有其他方法可以解决这个设计问题
非常感谢。
使用Twisted听起来很有道理。支持在Twisted中运行进程的低级API是reactor.spawnProcess。在流程说明文档中给出了一些使用示例。
这个API非常适合处理许多长时间运行的进程,并且与Twisted中的所有I/O API一样,当与另一个事件源(例如用户可以用来请求启动新进程的web服务器(结合时,它工作得很好。
reactor.spawnProcess
更像是标准库子流程模块,而不是multiprocessing
包。它为您提供了一种启动子进程的方法,该子进程运行特定的可执行文件,带有特定的参数等。它不提供高级API来在另一个进程中运行特定的Python函数。然而,构建这样一个东西并不太难(至少对于特定的情况(。考虑这种方法:
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选项在命令行上指定一个要运行的程序。