回覆列表
-
1 # 小鹹哥
-
2 # 家族帝國
有時候一次 http 請求的處理時間過長,而其中一部分程式碼又是不必同步執行的。我們就可以用以下函式把任務丟擲去非同步執行,同時介面立即返回。
這個函式具體的執行過程是:
呼叫時複製當前請求上下文 (request)
原請求立即繼續執行
func 被執行時,複製的 request 會被 push,從此這就可以被認為是一個全新的任務
須注意的是,因為複製的請求是被 push 進來的,所以 before_request 的訊號不會被觸發。但之後的 after_request 和 tear_doen_request 還會有。以及,因為只複製了 request,其他的上下文變數,如 g,是沒有被複制的。
lang:python
import gevent
from flask import copy_current_request_context
def i_have_a_dream(func, *args, **kwargs):
"""
非同步任務處理。本函式會立即返回,並使用 gevent 的新執行緒執行 func 函式(帶 request 上下文)。
"""
return gevent.spawn(copy_current_request_context(func), *args, **kwargs)
請參考這個例子,本質是Python多執行緒
from flask import Flask
import time
from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(1)
app = Flask(__name__)
@app.route("/synchronize")
def update_redis():
executor.submit(do_update)
return "ok"
def do_update():
time.sleep(3)
print("start update")
if __name__ == "__main__":
app.run()