使函数不等待它内部的其他函数

Aks*_*kar 5 python flask python-3.x

我有flask如下服务:

from flask import Flask, request
import json
import time


app = Flask(__name__)

@app.route("/first", methods=["POST"])
def main():
    print("Request received")

    func1()

    return json.dumps({"status": True})


def func1():
    time.sleep(100)
    print("Print function executed")


if __name__ == "__main__":
    app.run("0.0.0.0", 8080)
Run Code Online (Sandbox Code Playgroud)

所以现在当我使用http://localhost:8080/first发出请求时

  • 控制转到 main 方法并打印Request received并等待func1执行然后返回{"status": True}

但是现在我不想等待func1完成它的执行,而是它会发送{"status": True}func1继续它的执行。

Che*_* A. 5

为了回复来自烧瓶的请求,您需要完成装饰函数(在您的情况下,就是main)。

如果你想并行执行某件事,你需要在另一个线程或进程中执行它。多进程应用程序用于实现多个 CPU。(CPU 限制);在您的情况下,您只需要它并行执行,因此最好使用线程。

一个简单的技术是使用ThreadPool。ThreadPoolExecutor并发.futures导入,然后向其提交工作,这允许您的函数执行代码继续。尝试这个:

from flask import Flask, request
import json
import time
import os
from concurrent.futures import ThreadPoolExecutor


app = Flask(__name__)


# Task manager executor
_threadpool_cpus = int(os.cpu_count() / 2)
EXECUTOR = ThreadPoolExecutor(max_workers=max(_threadpool_cpus, 2))


@app.route("/first", methods=["POST"])
def main():
    print("Request received")
    EXECUTOR.submit(func1)
    return json.dumps({"status": True})


def func1():
    time.sleep(2)
    print("Print function executed")


if __name__ == "__main__":
    app.run("0.0.0.0", 8080)
Run Code Online (Sandbox Code Playgroud)

这将在不同的线程中运行func1,允许 Flask 响应用户而不会阻塞,直到func1完成。