所以我使用subprocess
使用Django通过Web界面生成一个长时间运行的进程。现在,如果用户想要返回页面,我想让他选择在稍后阶段终止subprocess
。
怎么办呢?我在Java中实现了相同的功能,并创建了一个全局单例ProcessManager字典来存储内存中的Process Object。我可以在Python中做类似的事情吗?
修改
是Singletons和ProcessManager的哈希是干净利落的方式。 Emmanuel的代码可以通过一些修改完美地完成。
由于
答案 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保存在持久存储(在数据库或文件中)中,并将它们与当前正在运行的进程列表相交按需。