Python线程池与进程池
前言
很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789
前面我们已经将线程并发编程与进程并行编程全部摸了个透,其实我第一次学习他们的时候感觉非常困难甚至是吃力。因为概念实在是太多了,各种锁,数据共享同步,各种方法等等让人十分头痛。所以这边要告诉你一个好消息,前面的所有学习的知识点其实都是为本章知识点做铺垫,在学习了本章节的内容后关于如何使用多线程并发与多进程并行就采取本章节中介绍的方式即可。
这里要介绍一点与之前内容不同的地方 ,即如果使用队列进行由进程池创建的进程之间数据共享的话不管是 multiprocessing
模块下的 Queue
还是 queue
模块下的 Queue
都不能为进程池中所创建的进程进行数据共享,我们需要用到另一个队列即 中的 。 当然这个我也会在下面介绍到。那么开始学习吧!
执行器
最早期的Python2中是没有线程池这一概念的,只有进程池。直到Python3的出现才引入了线程池,其实关于他们的使用都是非常简单,而且接口也是高度统一甚至说一模一样的。 而线程池与进程池的作用即是为了让我们能够更加便捷的管理线程或进程。
我们先说一下,如果需要使用线程池或进程池,需要导入模块 concurrent.futures
。
from concurrent.futures import ThreadPoolExecutor
# 线程池执行器
from concurrent.futures import ProcessPoolExecutor
# 进程池执行器
这里介绍一下,关于线程池或者进程池创建出的线程与进程与我们使用 multiprocessing
模块或者 threading
模块中创建的线程或进程有什么区别。我们以多线程为例:
import threading def task(): ident = threading.get_ident() print(ident) # 销毁当前执行任务的线程 if __name__ == '__main__': for i in range(10): t1 = threading.Thread(target=task,) # 领任务 t1.start() # 等待CPU调度,而不是立即执行 # 执行 # ==== 执行结果 ==== Ps:可以看到每个线程的id号都不一样,这也印证了图上说的。 """ 10392 12068 5708 13864 2604 7196 7324 9728 9664 472 """
import threading from concurrent.futures import ThreadPoolExecutor # 线程池执行器 def task(): ident = threading.get_ident() print(ident) # 结束任务,不销毁当前执行任务的线程,直到所有任务都执行完毕。 if __name__ == '__main__': pool = ThreadPoolExecutor(max_workers=2) # 这里代表有2个线程可以领取任务 for i in range(10): pool.submit(task) # 执行器启动任务,将这些任务给2