我什么时候可以在 flask 函数的早期 return 之后调用 multiprocess.close() 或 process.join()?
When can I call multiprocess.close() or process.join() after early return in flask function?
我想做什么
当 Flask 应用程序收到对特定端点(例如 /scale-up)的请求时,
由于打开 EC2 实例需要超过 5 分钟,我尝试 运行 不同进程中的逻辑并直接向用户发送响应(不要等到该进程打开 EC2 实例)发送请求。
但是遇到这种情况,不知道什么时候可以close()和join()进程
回顾一下,
当请求进来时,它只是 'executes' 一个需要很长时间的过程,除此之外我只是发送一个 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)
.....
非常感谢。这是我第一次在这里提问...
没有理由将多处理池用于 运行 单个进程,因此也不需要 close
和 join
。但即使是 运行 一个 Process
,也确实没有地方或需要为此调用 join
。该过程将 运行 异步并在您当前的请求终止后结束。
更新
为了防止 defunct 进程,因为你不能在启动的进程上执行 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()
我想做什么 当 Flask 应用程序收到对特定端点(例如 /scale-up)的请求时, 由于打开 EC2 实例需要超过 5 分钟,我尝试 运行 不同进程中的逻辑并直接向用户发送响应(不要等到该进程打开 EC2 实例)发送请求。
但是遇到这种情况,不知道什么时候可以close()和join()进程
回顾一下, 当请求进来时,它只是 'executes' 一个需要很长时间的过程,除此之外我只是发送一个 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)
.....
非常感谢。这是我第一次在这里提问...
没有理由将多处理池用于 运行 单个进程,因此也不需要 close
和 join
。但即使是 运行 一个 Process
,也确实没有地方或需要为此调用 join
。该过程将 运行 异步并在您当前的请求终止后结束。
更新
为了防止 defunct 进程,因为你不能在启动的进程上执行 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()