摘要:
- 进程池与线程池
- 同步调用和异步调用
- 回调函数
- 协程
一、进程池与线程池:
1、池的概念:
不管是线程还是进程,都不能无限制的开下去,总会消耗和占用资源。
也就是说,硬件的承载能力是有限度的,在保证高效率工作的同时应该还需要保证硬件的资源占用情况,所以需要给硬件设置一个上限来减轻硬件的压力,所以就有了池的概念。
2、进程池与线程池的使用方法:(进程与线程的创建基本相似,所以进程池与线程池的使用过程也基本一样)
from concurrent.futures import ProcessPoolExecutor # 导入进程池模块 from concurrent.futures import ThreadPoolExecutor # 导入线程池模块 import os import time import random # 下面以进程池为例,线程池只是使用导入模块不一样,仅此而已。 def task(name): print('name:[%s]|进程:[%s]正在运行' % (name, os.getpid())) time.sleep(random.randint(1, 3)) # 模拟进程运行耗费时间。 # 这一步的必要性:在创建进程时,会将代码以模块的方式从头到尾导入加载执行一遍 # (所以创建线程如果不写在main里面的话,这个py文件里面的所有代码都会从头到尾加载执行一遍 # 就会导致在创建进程的时候产生死循环。) if __name__ == '__main__': pool = ProcessPoolExecutor(4) # 设置线程池的大小,默认等于cpu的核心数。 for i in range(10): pool.submit(task, '进程%s' % i) # 异步提交(提交后不等待) pool.shutdown(wait=True) # 关闭进程池入口不再提交,同时等待进程池全部运行完毕。(类似join方法) print('主') # 标识一下主进程的完毕之前的语句
# 运行过程及结果: name:[进程0]|进程:[4080]正在运行 name:[进程1]|进程:[18336]正在运行 name:[进程2]|进程:[19864]正在运行 name:[进程3]|进程:[25604]正在运行 name:[进程4]|进程:[4080]正在运行 name:[进程5]|进程:[18336]正在运行 name:[进程6]|进程:[4080]正在运行 name:[进程7]|进程:[19864]正在运行 name:[进程8]|进程:[25604]正在运行 name:[进程9]|进程:[18336]正在运行 主