我什么时候可以在 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)
    .....

非常感谢。这是我第一次在这里提问...

没有理由将多处理池用于 运行 单个进程,因此也不需要 closejoin。但即使是 运行 一个 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()