python 多进程

来源:互联网 发布:java easyui tree例子 编辑:程序博客网 时间:2024/06/03 19:55
一.进程
  •  概念:一个程序运行的代码+用到的资源,操作系统分配资源的基本单元。
  • 程序:静态概念 存在于外存上的一段文件数据
  • 进程:动态概念 数据与资源的统称
  •  经典三个状态:
    • 就绪态:全部就绪,只等cpu
    • 执行态:cpu正在执行功能
    • 等待态:等待某些条件满足(input sleep)
    • 就绪态—— cpu分配时间片——>  执行态——等待条件—— >等待态——满足条件——  >就绪态
  • 进程的创建
    • 引用multiprocessing模块,使用 Precess类,进程类。
    • 创建过程
      • from multiprocessing import Precess
      • import time,os
      • def  fun():
      • print(“创建子进程”)
      • Print(“这是子进程%d,子进程的父进程%d”%os.getpid(),os.getppid())
      • time sleep(2)
      • if __name__ == “__main__”
      • N = Multiprocessing.Process(target= fun)
      • N.start()
      • While True:
      • Print(“这是主进程ID%d”%os.getpid())
      1. N.is_alive()判断进程是否活着 返回bool值 
      2. N.join() 主进程等待子进程结束 主进程阻塞等待退出,join 可添加参数 最多等多少秒
      3. N.terminate() 是一个信号 通知系统关闭子进程 因此需要等一段时间 子线程才会结束 配合join使用
      4. N.name() 进程名字 N.getpid() 进程号
    • linux 命令 ps aux 查看进程
    • os.getpid()获取子进程号  os.getppid()获取子进程的父进程号
    • 进程间不共享全局变量 ,原因 进程是独立的空间,
  • 进程间通信Queue 队列类
    • get 获取数据
      • get(block=True, timeout=-1])
      •  block表示是否阻塞等待 True表示阻塞等待 False表示不阻塞 不等待
      • timeout 表示如果等待  等待最长的时间  -1表示死等
    • put 接收数据 
      • put(obj, block, timeout)
      • obj表示数据对象
      • block表示是否阻塞等待 True表示阻塞等待 False表示不阻塞 不等待
      • timeout 表示如果等待  等待最长的时间,-1表示死等
    • Queue的参数 最大可接收队列
    • Queue.full()判断队列是否满 返回bool
    • Queue.empty() 
    • Queue.qsize()判断队列长度 返回int(Mac不支持)
                        
二、进程与线程
    进程是操作系统资源分配的基本单位,资源消耗大
    线程是操作系统资源的调度单位,资源消耗小,但不便管理



三、进程池
    创建进程池
    po = multiprocessing.Pool(3) 参数代表最大进程数
    添加任务
1.阻塞任务添加方式,会阻塞等待任务执行完成。
    Pool.apply(func=指定函数,args=())
2.非阻塞任务添加方式,不阻塞等待任务完成
    pool.apply_async()
主进程一旦退出会导致所有任务结束
    关闭进程池 —不允许添加任务
Pool.close()
pool.terminate()暴力终止 
    等待所有任务完成
Pool.join()
3.进程池中的通信 不同与进程中的processing.Queue()
进程池中的通信:multiprocessing.Manager().Queue()
.close().terminate()一般加上join()使用