我想要做什么 當 Flask 應用程式收到對特定端點(例如 /scale-up)的請求時,由于打開 EC2 實體需要 5 分鐘以上,我嘗試在不同的行程中運行該邏輯,并且直接向發送請求的用戶發送回應(不要等到該行程打開 EC2 實體)。
但是當這種情況發生時,我不知道什么時候可以 close() 和 join() 行程。
總結一下,當一個請求進來時,它只“執行”一個需要很長時間的程序,除此之外,我只發送一個 OK 回應。之后,我如何關閉并加入這個程序?
我嘗試使用flask 的teardown_request 裝飾器,但這似乎也不是正確的方法。
這是我的代碼。
import multiprocessing
from flask import Flask, Response
from multiprocessing import Pool
app = Flask(__name__)
@app.route(f'/scale-up')
def send_scale_up_request():
try:
p = Pool(4)
p.apply_async(scale_up_instance)
logger.info("Executing to restart the instance...")
return Response("Executing to restart the instance...")
# where can I put p.close() and p.join()??
except Exception as e:
logger.error("Error occured")
logger.error(e)
logger.error(traceback.format_exc(limit=None))
def scale_up_instance():
# turn on EC2 instance using aws sdk(boto3)
.....
非常感謝。這是我第一次在這里提問...
uj5u.com熱心網友回復:
沒有理由使用多處理池來運行單個行程,因此也不需要closeand join。但即使運行單個Process,也確實沒有地方或需要join為它打電話。該程序將異步運行并在您當前的請求終止后結束。
更新
為了避免倒閉的程序,因為你不能做一個join在啟動的程序,而不是運行scale_up_instance一個執行緒。如果由于某種原因執行緒不夠,執行緒可以啟動一個可以加入的行程:
import multiprocessing
from flask import Flask, Response
from threading import Thread
import time
app = Flask(__name__)
@app.route(f'/scale-up')
def send_scale_up_request():
try:
Thread(target=scale_up_instance).start()
logger.info("Executing to restart the instance...")
return Response("Executing to restart the instance...")
except Exception as e:
logger.error("Error occured")
logger.error(e)
logger.error(traceback.format_exc(limit=None))
def scale_up_instance():
# turn on EC2 instance using aws sdk(boto3)
import time
print('starting...')
time.sleep(10)
print('ending.')
# If multiprocessing is required because of GIL restrictions then:
from multiprocessing import Process
p = Process(target=do_scale_up) # defined elsewhere
p.start()
p.join()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/361294.html
下一篇:燒瓶中損壞的模態
