【问题标题】:Starting and stopping a method using flask routes (Python)使用烧瓶路由(Python)启动和停止方法
【发布时间】:2018-04-13 16:45:16
【问题描述】:

我正在使用 Flask 和 python(版本 3.6)构建一个小型实用程序。

这个实用程序基本上是使用 REST 调用来调用外部系统(sys1 和 sys2),并将数据从 sys1 单向同步到 sys2。 此同步过程将持续运行,直到设置终止标志。

我希望能够使用烧瓶路由启动和停止此同步过程/方法。

例如,

  • 如果在 /start 收到请求,
    o 然后启动再启动这个方法。
    o 返回一个 HTTP 响应代码(响应不应等待方法完成

  • 如果在 /stop 收到请求, o 如果方法正在运行,则通过设置 kill 标志停止该方法。 (同样,flask 的响应不应等待方法完成)

现在,我浏览了这里和其他网站的许多查询,但它们似乎都满足特定需求。根据我的理解,我尝试了以下事情(可能无法正确完成此任务:

  1. 尝试从路由创建线程并调用该方法 - 由于某种原因,flask 等待该方法完成而无法正常工作(是因为 flask 是单线程且阻塞的吗?)

  2. 阅读 celery,但我觉得在这种情况下使用 celery 可能有点矫枉过正。

异步启动此过程的正确方法是什么以及如何?线程? asyncio 或 Celery 是唯一的方法。

【问题讨论】:

  • 你可能需要设置flask才能使用线程,看看here。另一种选择可能是使用进程互操作,您可以使用 python 的子进程模块启动子进程并捕获信号以终止进程。

标签: python-3.x flask celery python-multithreading


【解决方案1】:

这是一个工作示例。当您调用 run 时,它将启动一个 1 秒的循环,打印“正在运行...”。然后,当您调用 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()

【讨论】:

  • 谢谢。这很有帮助。唯一的问题是,使用全局变量它对我不起作用。我最终得到的是创建文件 status.txt 并且在 while 循环开始时我总是使用 open 检查状态是否已更改。在停止端点我用相应的单词“stop”重写这个文件,这样while循环就会停止
  • 您可能可以使用环境变量并将其设置为活动/非活动而不是文本文件。只是import os; os.environ['running_flag'] = 'running'
猜你喜欢
  • 2013-02-04
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
相关资源
最近更新 更多