python_多进程_multiprocessing

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39532362/article/details/88086972

简单描述

所有子程单独处理,稳定性更优,性能linux和win差不多

常用类

  • class multiprocessing.Process(target,args,name)
    【构造进程对象】
    target传入函数名
    argsTuple类型,传入函数参数
    pro.start():启动进程
    pro.join():等待所有进程执行完毕

  • class multiprocessing.Pool(processes)
    【提供指定数量的进程池,新的请求提交时会先判断池子是否满,满了需等待】
    processes默认是CPU核数
    pool.close():调用后不能添加新的进程
    pool.join():等待所有进程执行完毕,调用前需要先调用close()
    pool.map(func,iterable,chunksize):根据多个参数构建进程任务并放入池
    pool.apply_async(target=None,args=()):同步执行进程,允许多个进程同时进入池子
    pool.apply(target=None,args=()):只允许一个进程进池,进程结束后才允许新进,间接让pool的value失效

  • class multiprocessing.Lock()
    【进程锁】
    lock.acquire():锁定
    lock.release():解锁

  • class multiprocessing.Manager()
    【进程间共享变量】
    mg.list():创建list类型共享变量
    mg.dict():创建dict类型共享变量

  • class multiprocessing.Queue()
    【用来在多个进程间通信,队列数据结构,先进先出
    qe.get(timeout):从队列中读取并删除一个元素
    qe.put(data,timeout):插入数据到队列中
    qe.close():关闭通道

  • class multiprocessing.Pipe()
    【两个进程间通信,返回Tuple,队列数据结构,先进先出
    pp.send(data):发出数据
    pp.recv():接受数据
    pp.close():关闭通道

常用函数

multiprocessing.cpu_count():返回环境cup数量
os.getppid():返回ppid,不同进程值可能相同
os.getpid():返回pid,不同进程值不同

example

pool.map()

# -*- coding:utf-8 -*- 
import multiprocessing
import os
import time

def fun1(obj):
  print('%s-%s : %s'%(os.getppid(),os.getpid(),obj['a']+obj['b']))
  time.sleep(1)

if __name__=='__main__':
  pool=multiprocessing.Pool(processes=2)
  # 每个任务只能传入一个参数,多参数用字典代替
  pool.map(func=fun1,iterable=({'a':1,'b':2},))
  pool.close()
  pool.join()

pool.apply_async()

# -*- coding:utf-8 -*- 
import multiprocessing
import os
import time

def fun1(a,b):
  print('%s-%s : %s'%(os.getppid(),os.getpid(),a+b))
  time.sleep(1)

if __name__=='__main__':
  pool=DummyPool(processes=2)
  # 把任务加入到池
  [pool.apply_async(func=fun1,args=(1,2)) for i in range(10)]
  pool.close()
  pool.join()

multiprocessing.Manager()

# -*- coding:utf-8 -*- 
import multiprocessing

def fun1(lock,mglist):
  lock.acquire()
  mglist.append('fun1')
  print('fun1:',mglist)
  lock.release()

def fun2(lock,mglist):
  lock.acquire()
  mglist.append('fun2')
  print('fun1:',mglist)
  lock.release()
 
if __name__=='__main__':
  lock=multiprocessing.Lock()
  mg=multiprocessing.Manager()  
  mglist=mg.list()

  pr1=multiprocessing.Process(target=fun1,args=(lock,mglist))
  pr2=multiprocessing.Process(target=fun2,args=(lock,mglist))
  prs=[pr1,pr2]
  [pr.start() for pr in prs]
  [pr.join() for pr in prs]

  print('out:',mglist)

multiprocessing.Queue()

# -*- coding:utf-8 -*- 
import multiprocessing

def fun1(q,a):
  q.put(a)
  q.put(2)

def fun2(q):
  print(q.get())
  print(q.get())
  q.close() # 关闭后就不能读取
 
if __name__=='__main__':
  q=multiprocessing.Queue()
  pr1=multiprocessing.Process(target=fun1,args=(q,2))
  pr2=multiprocessing.Process(target=fun2,args=(q,))
  prs=[pr1,pr2]
  [pr.start() for pr in prs]
  [pr.join() for pr in prs]

multiprocessing.Pipe

# -*- coding:utf-8 -*- 
import multiprocessing

def fun1(p,a):
  p.send(1)
  p.send(2)

def fun2(p):
  print(p.recv())
  print(p.recv())
  p.close() # 关闭后就不能读取
 
if __name__=='__main__':
  (p1,p2)=multiprocessing.Pipe()
  pr1=multiprocessing.Process(target=fun1,args=(p1,2))
  pr2=multiprocessing.Process(target=fun2,args=(p2,))
  prs=[pr1,pr2]
  [pr.start() for pr in prs]
  [pr.join() for pr in prs]

猜你喜欢

转载自blog.csdn.net/weixin_39532362/article/details/88086972