为何ThreadPoolExecutor提交的任务未并发反而按顺序执行?
问题原因与解决方案
你的代码根本没用到线程池的异步执行能力,核心错误出在任务提交的方式上:
- 你写的
tp.submit(m1())是直接在主线程中调用了m1函数,把函数执行后的返回值(这里是None)传给了submit方法,而不是把函数本身提交给线程池去异步执行。 - 这就导致程序会先同步跑完m1的整个循环,再跑m2,最后跑m3,完全是主线程里的串行执行,线程池的
max_workers=2根本没生效。
正确写法
把函数调用的括号去掉,直接传递函数对象给submit:
import time from concurrent.futures import ThreadPoolExecutor def m1(): for i in range(1,10): print(f"m1 i={i}") time.sleep(0.5) def m2(): for i in range(1, 10): print(f"m2 i={i}") time.sleep(0.5) def m3(): for i in range(1,10): print(f"m3 i={i}") time.sleep(0.5) with ThreadPoolExecutor(max_workers=2) as tp: tp.submit(m1) # 不带括号,传函数对象 tp.submit(m2) tp.submit(m3)
正确运行效果
修改后,线程池会先启动两个线程同时执行m1和m2,它们的输出会交替出现;当其中一个任务完成后,线程池才会启动第三个线程执行m3,符合你对多线程异步执行的预期。
内容的提问来源于stack exchange,提问作者yiming Sze
相关产品推荐
相关产品推荐

