- 进程池
- 进程的最佳数量:cpu核数+1
import os
os.cpu.count()
- 多线程最佳数量:cpu核数*5
- 进程池,一个池子,里面有固定数量的进程,这些进程一直属于待命状态,一旦有任务来,马上进行处理
- 同步调用 .apply(func,args=( , ))也就是说一个进程池中一个一个去执行任务
- 异步调用 .apply_async(func,args=( , ),callback = )进程池中进程一次性去执行任务返回值是一个对象,对象.get()获取值
- 进程池回调函数callback回调函数的pid和主进程pid一样,说明回调函数是主进程调用的,子进程只传值给回调函数
- 进程池回调函数callback回调函数的pid和主进程pid一样,说明回调函数是主进程调用的,子进程只传值给回调函数
- .map(func,iterable)
- func 进程池中执行的任务函数
- iterable,可迭代对象,依次把元素传给func当参数
- func 进程池中执行的任务函数
- 进程的最佳数量:cpu核数+1
- 线程
- 一个进程里可以有多个线程,轻量级的进程
- 切换速度更快
- 计算机的执行单位,计算机最小可执行单位是线程
- 线程不可以自己独立拥有资源,线程的执行必须依赖所属进程中的资源
- 进程中必须至少有一个线程
- 分为用户级线程和内核级线程
- 用户级线程,完全被程序员控制和执行
- 内核级线程,对于计算机内核来说,这样的线程完全被内核控制调度
- 用户级线程,完全被程序员控制和执行
- 收时间片影响
- 收到GIL锁影响
- 遇到网络延迟会被cpu踢掉,换下一个线程
- 一个进程里可以有多个线程,轻量级的进程
- GIL锁28.GIL (itprojects.cn)
- 全局解释器锁,只有Cpython有,锁的是Python解释器
- 限制了同一时间只能有一个线程放入cpu,限制了线程的执行时间
- 对于线程来说 ,因为有GIL锁,所以没有真正的并行,只有并发
- 如果想使用并行,请使用多进程
- 全局解释器锁,只有Cpython有,锁的是Python解释器
- 进程和线程的对比
- 子线程的pid和主进程的pid一样,在同一个进程里,所有的线程共享一个pid号
- 同一个进程内,所有线程共享全局变量
- 子线程的pid和主进程的pid一样,在同一个进程里,所有的线程共享一个pid号
- 守护线程
- 根据主线程的结束,线程就结束
- 根据主线程的结束,线程就结束
- 定时器
- 线程池
- from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
- 提交任务submit#提交多个任务,for + submit 多个任务提交
- .shutdown() 等效于 Pool 的 close + join 是指不允许往池子中再添加任务,然后让父进程(线程)等待池中所有进程(线程)执行完所有任务
- .map(func,iterable)也有,返回值是一个生成器
- 线程池中的回调函数是子线程调用,和父线程没有关系
- from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor