中止Flask应用程序中所有正在运行的功能

问题描述 投票:1回答:1

我正在使用Flask开发基于区块链的应用程序,我需要一个端点函数,该端点函数在调用时应中止所有正在运行的函数。例如:

import sys
import flask
import time

app = flask.Flask(__name__)

@app.route("/infi1")
def infi1():
    while True:
        print("infi1")
        time.sleep(1)

@app.route("/infi2")
def infi2():
    while True:
        print("infi2")
        time.sleep(1)

@app.route("/abort")
def abort_funcs():
    # when this function is called, all the running functions should be aborted
    ''' code to stop 
    all running functions '''
    pass

@app.route("/")
def index():
    return flask.request.remote_addr

app.run(host="0.0.0.0", port=8080)

我将首先运行infi1()和infi2(),因此我的应用程序将无限期打印两条消息-

curl -X GET http://localhost:8080/infi1
curl -X GET http://localhost:8080/infi2

$ python d.py 
 * Serving Flask app "d" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
infi1
infi1
infi1
infi1
infi1
infi2
infi1
infi2
infi1
infi2
infi1
infi2
infi1
infi2
infi1

但是当我向/ abort发出GET请求时,我希望这两个函数中止。

是否可以在flask应用程序中执行此操作?我知道我可以使用线程事件或标志,但是在我的应用程序中,if / while条件会有很多检查点。

谢谢!

python multithreading flask abort
1个回答
1
投票

您应该使用异步框架/服务器。像Flask这样的同步服务器仅一次只能做一件事,因此在当前运行的服务器完成之前,abort_funcs视图将不会被处理(在您的示例中,因为它们是无限循环,所以从未处理过)。

如果您的程序似乎一次处理多个请求,则可能是因为您正在其前面使用某个服务器,该服务器产生了多个进程,但是这些进程仍然是孤立的,并且每个进程一次只能处理一个视图。

使用异步服务器,您可以让那些视图在后台线程中启动无限循环,然后等待它们返回响应。另一个选择是在任务队列(例如Celery)中运行这些长循环,但这将消除这些任务直接返回视图响应的可能性。

© www.soinside.com 2019 - 2024. All rights reserved.