使用全局单一实例存储在内存中的对象子(Storing subprocess object in me

2019-10-17 16:27发布

所以我使用的subprocess产卵通过使用Django网络接口一个长期运行的进程。 现在,如果用户想要回来的页面,我想给他终止的选项subprocess在后面的阶段。

如何才能做到这一点? 我实现了同样的事情,在Java中,并提出了全球单ProcessManager的字典存储过程对象在内存中。 我可以做在Python类似的东西?

编辑

是单身和ProcessManager的的哈希值是干净做它的方式。 伊曼纽尔的代码可与一些修改完美的罚款。

谢谢

Answer 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负责创建的过程中,是对称的,其结局
  • 我没有在多线程足够的知识,知道这部作品在多线程模式


Answer 2:

您可以使用同样的技术在Python作为您在Java一样,那就是存储参考过程中的模块变量或执行一种单例。

你必须,而不是Java的唯一的问题是,Python没有大富大贵的比喻给Servlet规范,没有接口来处理应用程序开始或结束。 在大多数情况下,如何应用程序的许多实例在运行,你不应该担心,因为你从一个持久存储获取的所有数据。 但在这种情况下,你应该了解你的应用程序是如何部署。

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



文章来源: Storing subprocess object in memory using global singleton instance