首页 > 解决方案 > 为什么 Flask 应用程序在退出其 while 循环时仍在运行其线程?

问题描述

我正在编写一个 Flask 应用程序运行start=true并停止在start=false. 从日志中,我可以看到 while 循环在is_set()返回 False 时停止,但在应用程序再次开始运行之后。我尝试了不同的方法,但到目前为止似乎都没有奏效。有人可以对此有所了解吗?

@app.route('/')
def index():
    status = request.args.get('start', default=False, type=str)
    flag = threading.Event()
    
    if status == 'true':
        flag.set()
    else:
        flag.clear()
  
    t = threading.Thread(target=run, args=(flag,))
    t.start()
    t.join()

    return status

def run(flag):
    while flag.is_set() == True:
        print('running')
        time.sleep(1)
    print('done')

这是打印的日志:

running
running
running
done
127.0.0.1 - - [27/Aug/2021 20:52:46] "GET /?start=false HTTP/1.1" 200 -
running
running
running

标签: pythonpython-multithreading

解决方案


flag每次命中端点时,您都​​会创建一个新线程和一个新实例。这意味着flag为后续请求清除的 不会影响先前请求的。

running  #request 1
running  #request 1
running  #request 1
done     #request 2
127.0.0.1 - - [27/Aug/2021 20:52:46] "GET /?start=false HTTP/1.1" 200 -   #request 2
running  #request 1
running  #request 1
running  #request 1

如果你想用 http 请求控制线程,线程和标志的创建应该在请求处理程序之外。

t = threading.Thread(target=run, args=(flag,))
t.start()
flag = threading.Event()

@app.route('/')
def index():
    status = request.args.get('start', default=False, type=str)
    
    if status == 'true':
        flag.set()
        if !t.is_alive():
            t = threading.Thread(target=run, args=(flag,))
            t.start()
    else:
        flag.clear()
    return status

def run(flag):
    while flag.is_set() == True:
        print('running')
        time.sleep(1)
    print('done')

推荐阅读