gpt4 book ai didi

python - 从 Flask 请求启动新的子流程

转载 作者:太空狗 更新时间:2023-10-29 21:07:34 26 4
gpt4 key购买 nike

我有一个请求来自一个用 @app.route('/url/path/to/view') 装饰的函数。

它做了一些事情来查找一些数据并进行一些计算,在此期间该函数正常运行。但是,最后我想启动一个新进程(从一个 python 函数,当前使用 multiprocessing.Process)。一旦这个进程启动,我希望函数返回,而新进程继续独立运行。

我当前方法的伪代码

def start_process(arguments):
# some code here that the process will run

p = multiprocessing.Process(target=start_process, args=(...))
p.start()

return app.response("{ 'status': 'ok' }", mimetype='application/json')

这种方法行得通吗?Flask 应用程序能否在不影响新进程的情况下继续运行?

最佳答案

用多进程启动一个子进程是完全可以接受的。这是一个最小的工作示例,它使用多处理在后台更新数据库。正如 Audrius 所说,最终你可能想要一个合适的 task queue .

from flask import Flask, jsonify
import multiprocessing
import dataset
import time
import random

app = Flask(__name__)
DATABASE_URL = 'sqlite:///dev.db'

def add_person(name):
""" Add a person to the db. """
person = {'name': name, 'age': -1, 'status': 'processing'}
db = dataset.connect(DATABASE_URL)
db['people'].insert(person)
return True

def update_person(name):
""" Update a person in db with a fake long running process
that guesses a random age. """
time.sleep(10) # simulate a long running process
age = random.randint(1, 120)
person = {'name': name, 'age': age, 'status': 'finished'}
db = dataset.connect(DATABASE_URL)
db['people'].update(person, ['name'])
return True

def get_person(name):
""" Retrieve a person from the db. """
db = dataset.connect(DATABASE_URL)
person = db['people'].find_one(name=name)
return person

@app.route('/<name>')
def index(name):
""" Get person. If name not found, add_person to db and start update_person. """
if not get_person(name):
add_person(name)
thread = multiprocessing.Process(target=update_person, args=(name,))
thread.start()
person = get_person(name)
return jsonify(person)

if __name__ == '__main__':
app.run(debug=True)

在子进程运行时访问localhost:5000/bert:

{
"status": "processing",
"age": -1,
"name": "bert",
"id": 1
}

等待,然后刷新,你会看到子进程已经完成:

{
"status": "finished",
"age": 28,
"name": "bert",
"id": 1
}

关于python - 从 Flask 请求启动新的子流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14604408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com