使用全局单例实例在内存中存储子进程对象

时间:2013-02-04 05:44:39

标签: python django subprocess

所以我使用subprocess使用Django通过Web界面生成一个长时间运行的进程。现在,如果用户想要返回页面,我想让他选择在稍后阶段终止subprocess

怎么办呢?我在Java中实现了相同的功能,并创建了一个全局单例ProcessManager字典来存储内存中的Process Object。我可以在Python中做类似的事情吗?

修改

是Singletons和ProcessManager的哈希是干净利落的方式。 Emmanuel的代码可以通过一些修改完美地完成。

由于

2 个答案:

答案 0 :(得分:1)

我认为在python中实现Singleton模式的一种简单方法是通过类属性:

import subprocess

class ProcessManager(object):
    __PROCESS = None;

    @staticmethod
    def set_process(args):
        # Sets singleton process
        if __PROCESS is None:
            p = subprocess.Popen(args)
            ProcessManager.__PROCESS = p;
        # else: exception handling

    @staticmethod
    def kill_process():
        # Kills process
        if __PROCESS is None:
            # exception handling
        else:
            ProcessManager.__PROCESS.kill()

然后您可以通过以下方式使用此课程:

from my_module import ProcessManager

my_args = ...
ProcessManager.set_process(my_args)

...

ProcessManager.kill_process()

注意:

  • ProcessManager负责创建流程,与其结尾对称
  • 我对多线程知识不足以了解它是否适​​用于多线程模式

答案 1 :(得分:1)

您可以在Python中使用与在Java中相同的技术,即将过程的引用存储在模块变量中或实现一种单例。

与Java相比,唯一的问题是Python没有与Servlet规范类似的丰富类比,并且没有用于处理应用程序启动或结束的接口。在大多数情况下,您不应该担心应用程序的运行实例有多少,因为您从持久存储中获取所有数据。但在这种情况下,您应该了解应用程序的部署方式。

如果您的应用程序有一个长时间运行的实例(例如,FastCGI实例,或者在cherrypy上的单个WSGI应用程序),您可以在单独的模块中隔离进程处理功能,并在导入模块时加载它(任何模块仅在应用程序中导入一次)。如果有许多实例(许多FastCGI实例或普通的CGI脚本),您应该更好地分离子进程并将其ID保存在持久存储(在数据库或文件中)中,并将它们与当前正在运行的进程列表相交按需。