我正在尝试在我的烧瓶应用中使用线程,例如:
@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()
函数继续立即返回响应,这意味着我应该以不同的顺序看到上面的结果。
所以我想知道:
index()
函数一直等待do_sth_else()
完成谢谢!
答案 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!")