创建,管理和杀灭瓶中的应用程序的后台任务(Create, manage and kill backg

2019-10-20 00:22发布

我建立烧瓶的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对象就像我所描述的设计模式?

Answer 1:

你最好用celery这类任务(celeryproject.org)。 这么大的生产环境,没有在后来的发展死角的忧虑中。 它拥有所有你需要的管理后台任务以及更多。 以下是如何对它烧瓶整合 。



文章来源: Create, manage and kill background tasks in flask app