我正在使用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条件会有很多检查点。
谢谢!
您应该使用异步框架/服务器。像Flask这样的同步服务器仅一次只能做一件事,因此在当前运行的服务器完成之前,abort_funcs视图将不会被处理(在您的示例中,因为它们是无限循环,所以从未处理过)。
如果您的程序似乎一次处理多个请求,则可能是因为您正在其前面使用某个服务器,该服务器产生了多个进程,但是这些进程仍然是孤立的,并且每个进程一次只能处理一个视图。
使用异步服务器,您可以让那些视图在后台线程中启动无限循环,然后等待它们返回响应。另一个选择是在任务队列(例如Celery)中运行这些长循环,但这将消除这些任务直接返回视图响应的可能性。