前言
我正在编写一个web服务器,它允许用户访问一些用C编写的程序(我在这个C程序上使用Python包装器,它是PyCLIPS)。为了为很多用户服务,网络服务器必须启动大量的C程序副本,因为一个副本可以同时为很少的用户服务,大约有1-3个用户。此外,每个用户都应该只使用自己的拷贝,因此应该有大量的C程序副本。
这个C程序是一个http://clipsrules.sourceforge.net/,如果它能帮助理解的话.
因此,为了解决这个设计问题,我想编写一个Twisted TCP服务器,它就像一个长时间运行的进程池。每个长时间运行的进程都是一个小的Twisted TCP服务器,可以访问C程序的一个副本。
例如,用户要求池服务器为他保留一个长时间运行的进程,然后池服务器创建并运行一个开始监听某个端口的长时间运行的进程,然后池服务器将这个长进程的主机和端口返回给用户。现在,用户可以直接与这个长时间运行的进程通信.
问题
非常感谢。
发布于 2011-08-27 15:07:38
用Twisted做这个听起来很有道理。支持在Twisted中运行进程的低级API是reactor.spawnProcess。在工艺方法文档中给出了使用它的一些例子。
此API非常适合处理许多长期运行的进程,与Twisted中的所有I/O API一样,当与另一个事件源(如网络服务器用户可以用来请求启动新进程)组合时,它工作得很好。
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选项在命令行中指定一个程序以使其运行。
https://stackoverflow.com/questions/7214663
复制相似问题