我建立烧瓶的Web应用程序,其中用户可以启动和管理流程。 这些进程正在做一些繁重的计算(可能甚至几天)。 当进程在运行,这样可以节省一些部分结果到文件的工作。
因此,当用户开始新的过程中,我产生新的线程,并保存线程处理到flask.g全局变量。
def add_thread(thread_handle):
ctx = app.app_context()
threads = flask.g.get("threads", [])
threads.append(thread_handle)
g.threads = threads
ctx.push()
后来在需要时,用户可以终止长时间运行的过程。
def kill_thread(idx):
ctx = app.app_context()
threads = flask.g.get("threads", [])
threads.pop(idx).terminate()
g.threads = threads
ctx.push()
我不得不使用ctx.push()来存储线程的列表,以便与下一个请求,列表可用。 不过这样一来增加新的线程时抛出有关应用方面的异常。
Traceback (most recent call last):
File "/Users/mirobeka/.virtualenvs/cellular/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/Users/mirobeka/.virtualenvs/cellular/lib/python2.7/site-packages/flask/app.py", line 1825, in wsgi_app
ctx.auto_pop(error)
File "/Users/mirobeka/.virtualenvs/cellular/lib/python2.7/site-packages/flask/ctx.py", line 374, in auto_pop
self.pop(exc)
File "/Users/mirobeka/.virtualenvs/cellular/lib/python2.7/site-packages/flask/ctx.py", line 366, in pop
app_ctx.pop(exc)
File "/Users/mirobeka/.virtualenvs/cellular/lib/python2.7/site-packages/flask/ctx.py", line 178, in pop
% (rv, self)
AssertionError: Popped wrong app context. (<flask.ctx.AppContext object at 0x10fb99c50> instead of <flask.ctx.AppContext object at 0x10fa60150>)
这开始感到一种错误的解决方案和可能的死胡同在以后的发展。 我在想保存句柄在文件/数据库,但锁定对象不能腌制。
是否有现场管理Python对象就像我所描述的设计模式?