目录
前言
我们认识了进程、线程,也了解了多进程和多线程对于执行效率的好处,那么我们该怎么将它很好的运用于实战呢?比如我们要创建一百个线程,总不能用t0=Thread一直到t99=Thread吧,这样效率是极低的。所以我们引入一个新概念:线程池与进程池。
概念
线程池: 一次性开辟一些线程,我们用户直接给线程池提交任务,线程任务的调度交给线程池来完成。
进程池: 一次性开辟一些进程,我们用户直接给进程池提交任务,进程任务的调度交给进程池来完成。
实现
线程池
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
def fn(name):
for i in range(1000):
print(name, i)
if __name__ == '__main__':
# 创建线程池
with ThreadPoolExecutor(50) as t:
for i in range(100):
t.submit(fn, name=f"线程{i}")
# 等待线程池中的任务全部执行完毕. 才继续执行
print("123")
导包,可以看到导入了两个Executor,它们分别是线程池执行器和进程池执行器,用来调度任务。
我们通过submit提交线程,提交到有50个线程容量的线程池,每次循环提交一个输出1000个数字的线程。等待线程池所有任务结束后再打印主函数后面的“123”.
进程池
进程池很简单,只需要把上述代码中线程池执行器改为进程池执行器API即可。
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
def fn(name):
for i in range(1000):
print(name, i)
if __name__ == '__main__':
# 创建线程池
with ProcessPoolExecutor(50) as t:
for i in range(100):
t.submit(fn, name=f"进程{i}")
# 等待线程池中的任务全部执行完毕. 才继续执行(守护)
print("123")
运行效果
总结
我们本节学习了线程池与进程池的用法,下一节我们将通过实战练习线程池的用法。