使用烧瓶路线启动和停止方法(Python)
Starting and stopping a method using flask routes (Python)
我正在使用 Flask 和 python(3.6 版)构建一个小型实用程序。
此实用程序基本上是使用 REST 调用来调用外部系统(sys1 和 sys2),并将数据从 sys1 单向同步到 sys2。
此同步过程将持续 运行,直到设置终止标志。
我希望能够使用烧瓶路由启动和停止此同步process/method。
例如,
- 如果在 /start 收到请求,
o Then start then start this method.
o return HTTP 响应代码(响应不应等待方法完成)
- 如果在 /stop 收到请求,
o 如果方法是 运行ning,通过设置 kill 标志停止方法。
(再次强调,flask 的响应不应等待方法完成)
现在,我浏览了这里和其他网站的许多查询,但它们似乎都能满足特定需求。根据我的理解,我尝试了以下方法(可能无法正确完成此任务:
尝试从路由创建一个线程并调用该方法 - 由于某种原因 flask 等待该方法完成而无法正常工作(是因为 flask 是单线程且阻塞的吗?)
阅读芹菜,但我觉得在这种情况下使用芹菜可能有点矫枉过正。
异步启动此进程的正确方法是什么?如何启动?线程? asyncio 或 Celery 是唯一的方法。
这是一个工作示例。当您调用 run
时,它将启动一个 1 秒的循环并打印 "running..."。然后,当您调用 stop
时,它会修改线程函数检查循环并停止的全局变量。
您应该能够粘贴并离开,然后根据您的目的进行修改。
from flask import Flask, Response
from threading import Thread
from time import sleep
app = Flask(__name__)
stop_run = False
def my_function():
global stop_run
while not stop_run:
sleep(1)
print("running...")
def manual_run():
t = Thread(target=my_function)
t.start()
return "Processing"
@app.route("/stop", methods=['GET'])
def set_stop_run():
global stop_run
stop_run = True
return "Application stopped"
@app.route("/run", methods=['GET'])
def run_process():
global stop_run
stop_run = False
return Response(manual_run(), mimetype="text/html")
if __name__ == "__main__":
app.run()
我正在使用 Flask 和 python(3.6 版)构建一个小型实用程序。
此实用程序基本上是使用 REST 调用来调用外部系统(sys1 和 sys2),并将数据从 sys1 单向同步到 sys2。 此同步过程将持续 运行,直到设置终止标志。
我希望能够使用烧瓶路由启动和停止此同步process/method。
例如,
- 如果在 /start 收到请求,
o Then start then start this method.
o return HTTP 响应代码(响应不应等待方法完成) - 如果在 /stop 收到请求, o 如果方法是 运行ning,通过设置 kill 标志停止方法。 (再次强调,flask 的响应不应等待方法完成)
现在,我浏览了这里和其他网站的许多查询,但它们似乎都能满足特定需求。根据我的理解,我尝试了以下方法(可能无法正确完成此任务:
尝试从路由创建一个线程并调用该方法 - 由于某种原因 flask 等待该方法完成而无法正常工作(是因为 flask 是单线程且阻塞的吗?)
阅读芹菜,但我觉得在这种情况下使用芹菜可能有点矫枉过正。
异步启动此进程的正确方法是什么?如何启动?线程? asyncio 或 Celery 是唯一的方法。
这是一个工作示例。当您调用 run
时,它将启动一个 1 秒的循环并打印 "running..."。然后,当您调用 stop
时,它会修改线程函数检查循环并停止的全局变量。
您应该能够粘贴并离开,然后根据您的目的进行修改。
from flask import Flask, Response
from threading import Thread
from time import sleep
app = Flask(__name__)
stop_run = False
def my_function():
global stop_run
while not stop_run:
sleep(1)
print("running...")
def manual_run():
t = Thread(target=my_function)
t.start()
return "Processing"
@app.route("/stop", methods=['GET'])
def set_stop_run():
global stop_run
stop_run = True
return "Application stopped"
@app.route("/run", methods=['GET'])
def run_process():
global stop_run
stop_run = False
return Response(manual_run(), mimetype="text/html")
if __name__ == "__main__":
app.run()