如何在Flask应用程序中初始化多处理类

时间:2018-11-01 16:36:15

标签: python-3.x flask

我一直关注Miguel Grinberg's Flask tutorial,我的应用程序具有相同的结构(https://github.com/miguelgrinberg/microblog/tree/v0.22)。

我现在想在正在监听队列的类中添加一个多处理函数,但是我不确定如何正确地初始化它。

如本教程中的建议here一样,我的初始化看起来像这样:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
# and so on

db = SQLAlchemy()
migrate = Migrate()
# and so on

def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)
    # and so on 

    db.init_app(app)
    migrate.init_app(app, db)
    # and so on

    from app.auth import bp as auth_bp
    app.register_blueprint(auth_bp)
    # and so on

    return app

from app import models

多重处理类位于一个名为worker.py的文件中:

class Worker(object):

    def __init__(self):
        self._pool = None
        self._in_q = Queue()

    def start(self):
        self._pool = Pool(os.cpu_count())
        self._thread = Thread(target=self._process, args=(), daemon=True)
        self._thread.start()

    def stop(self):
        self._pool.close()
        self._pool.join()
        self._pool = None
        self.result_q.put(None)

    def _process(self):
        while True:
            task = self._in_q.get()
            if task is None:
                print("shutdown")
                return
            self._pool.apply_async(_work, (w,), callback=finished)

    def do_work(self):
        # Work on something here
        return self

def _work(value):
    value = Worker.do_work(value)
    return value

def finished(self):
    print("I am done.")

我想我现在需要在init的某个位置初始化一次worker,以便随后可以将其从应用程序中其他各个位置放入队列中,但是我既不知道如何初始化它,也不知道如何调用它来自其他部分。

1 个答案:

答案 0 :(得分:0)

解决方案是将其放在flask应用程序外部并在其中运行。在flask应用程序内无需执行此操作。