穿线不在烧瓶中工作

时间:2015-02-26 08:06:53

标签: python multithreading flask

我正在尝试在我的烧瓶应用中使用线程,例如:

@app.route('/index')
def index():
    t = threading.Thread(do_sth_else())
    t.start()
    print('ready to response')
    return render_template('index.html')

def do_sth_else():
    time.sleep(5)
    print('sth else done')

在浏览器中调用127.0.0.1:5000/index时,服务器控制台中的结果不符合我的预期:

sth else done
ready to response

我希望do_sth_else()函数在其他一些线程中运行,而index()函数继续立即返回响应,这意味着我应该以不同的顺序看到上面的结果。

所以我想知道:

  1. 为什么index()函数一直等待do_sth_else()完成
  2. 如何让应用程序正常运行
  3. 谢谢!

3 个答案:

答案 0 :(得分:2)

t = threading.Thread(do_sth_else())调用do_sth_else()并将结果传递给Thread。 您应该像t = threading.Thread(do_sth_else)一样使用它。

答案 1 :(得分:1)

对于Python中的实际并行化,您应该使用multiprocessing模块来分叉并行执行的多个进程。 Python线程提供交错,但实际上是串行执行,而不是并行执行。

这适用于CPython,因为存在全局解释器锁,否则真正的并发性与你拥有的cpu数量绑定

答案 2 :(得分:1)

此示例按您的意愿工作(在Python 3.4.3上测试)

from time import sleep
from concurrent.futures import ThreadPoolExecutor

# DOCS https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor
executor = ThreadPoolExecutor(2)


@app.route('/index')
def index():
    executor.submit(do_sth_else)
    print('ready to response')
    return render_template('index.html')


def do_sth_else():
    print("Task started!")
    sleep(10)
    print("Task is done!")