1

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

怎么能做到这一点?我在 Java 中实现了同样的事情,并制作了一个全局单例 ProcessManager 字典来将进程对象存储在内存中。我可以在 Python 中做类似的事情吗?

编辑

是的 Singletons 和 ProcessManager 的哈希是干净的方式。Emmanuel 的代码只需稍作修改即可完美运行。

谢谢

4

2 回答 2

1

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

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创建过程,与结束对称
  • 我没有足够的多线程知识来知道这是否适用于多线程模式
于 2013-02-04T09:59:35.533 回答
1

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

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

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

于 2013-02-04T17:03:54.497 回答