【问题标题】:issue where Flask app request handling is choked when a regex.serach is happening?发生 regex.search 时 Flask 应用程序请求处理被阻塞的问题?
【发布时间】:2020-06-23 07:20:24
【问题描述】:

设置:

  • 我使用的语言是 Python
  • 我正在使用threaded =True 运行一个烧瓶应用程序,当一个端点被命中时,它在烧瓶应用程序内部启动一个线程并返回一个成功启动的线程,状态码为 200。
  • 在线程内部,发生了 re.Search,这需要 30-40 秒(最坏情况),一旦线程完成,它会点击回调 URL 完成一个请求。
  • 理想情况下,Flask 应用程序能够处理并发请求

问题:

当 re.search 在线程内发生时,flask 应用程序不接受并发请求。我假设某种线程锁定正在发生并且无法弄清楚。

问题:

  1. 是否可以在具有“线程 = True”的烧瓶应用程序中进行线程处理(使用多处理)?
  2. 当正则表达式发生时,它会执行任何线程锁定吗?

代码 sn-p:hit_callback 向另一个此问题不需要的 api 发出 post 请求。

import threading
from flask import *
import re
app = Flask(__name__)

@app.route(/text)
def temp():
    text = request.json["text"]
    def extract_company(text)


        attrib_list = ["llc","ltd"] # realone is 700 in length
        entity_attrib = r"((\s|^)" + r"(.)?(\s|$)|(\s|^)".join(attrib_list) + r"(\s|$))"
        raw_client = re.search("(.*(?:" + entity_attrib + "))", text, re.I)

        hit_callback(raw_client)

    extract_thread = threading.Thread(target=extract_company, )
    extract_thread.start()

    return jsonify({"Response": True}), 200

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=4557, threaded=True)

【问题讨论】:

    标签: python regex multithreading flask


    【解决方案1】:

    请阅读 GIL - 基本上,Python 只能同时执行一段代码 - 即使在线程中也是如此。因此,您的重新搜索会运行并阻塞所有其他线程,直到运行完成。

    解决方案:使用 Gunicorn 等 pp 运行多个烧瓶进程 - 不要试图在一个烧瓶进程中完成所有操作。

    添加一些东西:你的设计也有问题 - 40 秒左右的 http 答案太长了。一个更好的设计应该至少有两个服务:一个网络服务器和一个搜索服务。第一个将注册搜索并返回一个ID。您的搜索服务将与 Web 服务异步通信,并在结果准备好时返回resullt +id。您的客户可以拉取 Web 服务,直到获得结果。

    【讨论】:

    • 好的,知道了。最后就像你的意思是游泳池对吧?我会调查 Gunicorn。我们很快就会转向 Web 服务器方法。我只是想了解这里的问题。能否请您评论 pp 以运行多个烧瓶进程。
    猜你喜欢
    • 2023-03-06
    • 2012-08-05
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2023-03-09
    • 2022-01-06
    • 2017-01-31
    • 2013-09-11
    相关资源
    最近更新 更多