摘要:

  • 进程池与线程池
  • 同步调用和异步调用
  • 回调函数
  • 协程

一、进程池与线程池:

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]正在运行
主
运行结果

相关文章: