前言
我正在编写一个Web服务器,它允许用户访问一些用C编写的程序(我在这个C程序上使用的是Python包装器,它是PyCLIPS)。为了服务很多用户,网络服务器必须启动这个C程序的大量副本,因为一个副本可以同时为很少的用户服务,大约1-3个用户。此外,每个用户应该只使用自己的副本,因此应该是C程序的很多副本。
这个C程序是CLIPS engine,如果它有助于理解。
因此,为了解决这个设计问题,我想编写一个Twisted TCP服务器,它就像一个长时间运行的进程池。每个长时间运行的进程都是一个小的Twisted TCP服务器,可以访问C程序的一个副本。
例如,用户要求池服务器为他保留一个长时间运行的进程,然后池服务器创建并运行一个长时间运行的进程,该进程开始侦听某个端口,然后是池服务器将此长时间运行进程的主机和端口返回给用户。现在,用户可以直接与这个长时间运行的进程通信。
问题
非常感谢。
答案 0 :(得分:4)
使用Twisted这听起来很有意义。支持在Twisted中运行进程的低级API是reactor.spawnProcess。其用法的一些示例在process howto文档中给出。
此API非常适合处理许多长时间运行的进程,并且与Twisted中的所有I / O API一样,与其他事件源结合使用时效果很好,例如a web server用户可以用来请求新的流程启动。
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选项在命令行上指定一个程序来运行它。