如何在Twisted中生成长时间运行的进程

时间:2011-08-27 12:49:26

标签: twisted long-running-processes clips

前言

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

这个C程序是CLIPS engine,如果它有助于理解。


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

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


问题

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

1 个答案:

答案 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选项在命令行上指定一个程序来运行它。