进程池,线程,GIL锁,线程池

  • 进程池
    • 进程的最佳数量:cpu核数+1
      import os
      os.cpu.count()
    • 多线程最佳数量:cpu核数*5
    • 进程池,一个池子,里面有固定数量的进程,这些进程一直属于待命状态,一旦有任务来,马上进行处理
    • 同步调用 .apply(func,args=( , ))也就是说一个进程池中一个一个去执行任务
    • 异步调用 .apply_async(func,args=( , ),callback = )进程池中进程一次性去执行任务返回值是一个对象,对象.get()获取值
      • 进程池回调函数callback回调函数的pid和主进程pid一样,说明回调函数是主进程调用的,子进程只传值给回调函数
    • .map(func,iterable)
      • func 进程池中执行的任务函数
      • iterable,可迭代对象,依次把元素传给func当参数
  • 线程
    • 一个进程里可以有多个线程,轻量级的进程
    • 切换速度更快
    • 计算机的执行单位,计算机最小可执行单位是线程
    • 线程不可以自己独立拥有资源,线程的执行必须依赖所属进程中的资源
    • 进程中必须至少有一个线程
    • 分为用户级线程和内核级线程
      • 用户级线程,完全被程序员控制和执行
      • 内核级线程,对于计算机内核来说,这样的线程完全被内核控制调度
    • 收时间片影响
    • 收到GIL锁影响
    • 遇到网络延迟会被cpu踢掉,换下一个线程
  • GIL锁28.GIL (itprojects.cn)
    • 全局解释器锁,只有Cpython有,锁的是Python解释器
    • 限制了同一时间只能有一个线程放入cpu,限制了线程的执行时间
    • 对于线程来说 ,因为有GIL锁,所以没有真正的并行,只有并发
    • 如果想使用并行,请使用多进程
  • 进程和线程的对比
    • 子线程的pid和主进程的pid一样,在同一个进程里,所有的线程共享一个pid号
    • 同一个进程内,所有线程共享全局变量
  • 守护线程
    • 根据主线程的结束,线程就结束
  • 定时器
  • 线程池
    • from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
    • 提交任务submit#提交多个任务,for + submit 多个任务提交
    • .shutdown() 等效于 Pool 的 close + join 是指不允许往池子中再添加任务,然后让父进程(线程)等待池中所有进程(线程)执行完所有任务
    • .map(func,iterable)也有,返回值是一个生成器
    • 线程池中的回调函数是子线程调用,和父线程没有关系
  •  
posted @   3notblv  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示