在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ flask路由中使用threading報錯

flask路由中使用threading報錯

我有一個修改數(shù)據(jù)庫的操作,非常耗時,是寫在路由中的,要等該操作執(zhí)行完路由才會return。于是我試著用了一下threading模塊,起了一個線程去執(zhí)行該操作,而無需等待它執(zhí)行完,路由直接返回狀態(tài)。但是這樣用的時候始終報錯圖片描述

數(shù)據(jù)庫連接用的SQLAlchemy,寫了一個最簡單的例子,求大家?guī)臀铱纯磫栴}出在哪里
定義model:

class Plan(db.Model):
    __tablename__ = 'opt_version_plans'

    planid = db.Column(db.Integer,primary_key=True)
    planname = db.Column(db.String(255))
    jobname = db.Column(db.String(255))
    branch = db.Column(db.String(32))

定義一個函數(shù):

def test():
    time.sleep(20)
    p = Plan.query.get(1)
    print p.planname

路由:

@app.route('/')
def index():
    t = threading.Thread(target=test)
    t.start()
    return "helloworld"

請求/就會出現(xiàn)上面的那個報錯,網(wǎng)上查了查,還是不懂原因,請問用這種方式,我該怎么做?

回答
編輯回答
逗婦乳

因為你用了flask-sqlalchemy擴展,而且你新開了一個線程執(zhí)行test方法,這個線程已經(jīng)脫離了 Flask app 的應用上下文,如果非要按照你上面的例子的話,可以這樣修改

def test():
    time.sleep(20)
    with app.app_context():
        p = Plan.query.get(1)
    print p.planname

另外,你的思路沒錯,但是一個通用的解決辦法是使用Celery將你那個耗時的任務(wù)異步執(zhí)行。

@celery.task
def test():
    p = Plan.query.get(1)
    print p.planname
    return p

@app.route('/')
def index():
    task = test.delay()  #: 異步執(zhí)行
    return "hello world"

具體CeleryFlask的搭配可以自己網(wǎng)上查查

2018年4月29日 12:12
編輯回答
葬愛

碰巧,我前幾天在寫《基于 flask-socketio 的 CRUD 操作初探》遇到過這樣的問題,這是因為你的 test() 函數(shù)里的 Plan ,也就是定義數(shù)據(jù)庫的類,沒有在 flask 的應用上下文里??隙〞箦e。

2017年6月28日 04:31