python-多进程

大纲

1
2
3
4
python多进程简述
python多进程模块方法介绍
python多进程使用

  • python多进程模块简述:

    python由于GIL机制,多线程,实际仅消耗一个内核资源;因此效率较低,python要实现并发,提高性能,只能使用多进程模块,python的多进程模块为multiprocessing,通过使用Pool类实现多进程;

  • python多进程模块方法介绍:

    python多进程模块为multiprocessing,为python的内置模块;通过该模块封装的Pool()对象实现多进程,Pool类的属性介绍如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from multiprocessing import Pool

    run=run() #需要被执行的方法/任务
    iter=iter #迭代对象,list/变量值

    pool=Pool(3) #创建一个仅容纳3个进程的进程池,一旦工作任务超出进程的数量,则需等待,进程池中的进程被释放,任务才能进入进程池;
    __init__(self, group=None, target=None, name=None, args=(), kwargs={}) #进程池的构造方法
    group:进程池所属的进程组,一旦不需要给值;
    target:待处理的任务或方法;
    name:进程池的别名,默认不给值;
    args:调用对象的位置参数,可给值元组/列表等可迭代对象或者参数值;
    kwargs:调用对象的字典参数;

    使用:在win环境下,进程池必须在当前模块下执行,即必须在 if __name__==main:下执行;
    • Pool()类中拥有的属性方法如下:
    • pool.map()
      1
      2
      3
      4
      函数原型:map(func, iterable[, chunksize=None])
      pool.map(run,iter) #使用进程池中的进程来同步构造任务为run,参数为iter的对象,具体效果等同于map()方法;
      pool.close() #通过主进程,关闭进程池,子进程任务未完成时,进程池不能接受新的子进程;
      pool.join() $通过执行子进程,并等待所有子进程执行完,才进行下一步操作;
    • pool.map_async(run,iter)
      1
      2
      3
      4
      5
      函数原型:map_async(func, iterable[, chunksize=None])
      pool.map_async(run,iter) #使用进程池中的进程来同步构造任务为run,参数为iter的对象,具体效果等同于map()方法;
      pool.close() #通过主进程,关闭进程池,子进程任务未完成时,进程池不能接受新的子进程;
      pool.join() $通过执行子进程,并等待所有子进程执行完,才进行下一步操作;
      ---效果和pool.map()不相同,mapasyc效率更高;mapasyc主进程未阻塞进程池,不需要等该批次的进程全执行完,新的任务就能进入进程池执行;常用pool.map()
    • pool.apply()
      1
      2
      3
      函数原型:apply(func[, args=()[, kwds={}]])
      apply,参数需要为具体的变量值,且仅在python2支持;
      apply方法的原理是,阻塞进程池,一次仅让一个任务进入进程池,该任务完成后,才能执行下一个任务,实际是串行;
    • pool.applyasyc()
      1
      2
      3
      4
      5
         函数原型:apply(func[, args=()[, kwds={}]],[, callback=None]]])
      applyasyc,参数需要为具体的变量值,在python3上支持;
      applyasyc方法的原理是,进程池非阻塞,一次可以让多个任务进入进程池,且未对该批次任务进行阻塞,只要其中一个进程执行完后,就能释放资源,让新的任务进入进程池,实际是并行的,效率等同于mapasyc();
      回调使用:pool.applyasyc(run,kwargs,callback=func2),run的返回作为func2的参数,执行完返回func2的值;
      ---applyasyc效果等同于mapasyc(),只是他具有回调功能,且入参的变量不能是可迭代对象,必须为具体的变量值;
    • pool.terminal()
      1
      2
      3
      4
      5
      6
      作用:结束工作进程,不在处理未完成的任务
      pool.map(run,iter)
      pool.close()
      pool.run()
      sleep(2)
      pool.terminal() #执行两秒后,哪怕进程未执行完,也结束该主进程
  • python多进程使用:

1
2
3
4
5
6
7
8
from multiprocessing import Pool

run=run()
iter=iter

pool=Pool(multiprocessing.cpu_count())
pool.map(run(),iter)
pool.join()

欢迎关注我的其它发布渠道