当前位置:   article > 正文

multiprocessing进程模块_multiprocessing close join

multiprocessing close join

multiprocessing模块提供了一个Process类来代表一个进程对象,multiprocessing模块像线程一样管理进程,这个是multiprocessing的核心,它与threading很相似,对多核CPU的利用率会比threading好的多。

 

看一下Process类的构造方法:

__init__(self, group=None, target=None, name=None, args=(), kwargs={})

参数说明: 
group:进程所属组(基本不用) 
target:表示调用对象
args:表示调用对象的位置参数元组
name:别名 
kwargs:表示调用对象的字典

  1. import multiprocessing
  2. def do(n): # 参数n由args=(1,)传入
  3. name = multiprocessing.current_process().name # 获取当前进程的名字
  4. print(name, 'starting')
  5. print("worker ", n)
  6. return
  7. if __name__ == '__main__':
  8. numList = []
  9. for i in range(5):
  10. p = multiprocessing.Process(target=do, args=(i,)) # (i,)中加入","表示元祖
  11. numList.append(p)
  12. print(numList)
  13. p.start() # 用start()方法启动进程,执行do()方法
  14. p.join() # 等待子进程结束以后再继续往下运行,通常用于进程间的同步
  15. print("Process end.")

二、Pool类

 Pool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果池还没有满,就会创建一个新的进程来执行请求。如果池满,请求就会告知先等待,直到池中有进程结束,才会创建新的进程来执行这些请求
下面介绍一下multiprocessing 模块下的Pool类下的几个方法:

1.apply()

函数原型:apply(func[, args=()[, kwds={}]])

该函数用于传递不定参数,同python中的apply函数一致,主进程会被阻塞直到函数执行结束(不建议使用,并且3.x以后不再出现)

2.apply_async

函数原型:apply_async(func[, args=()[, kwds={}[, callback=None]]])

与apply用法一致,但它是非阻塞的且支持结果返回后进行回调

3.map()

函数原型:map(func, iterable[, chunksize=None])

Pool类中的map方法,与内置的map函数用法行为基本一致,它会使进程阻塞直到结果返回
注意:虽然第二个参数是一个迭代器,但在实际使用中,必须在整个队列都就绪后,程序才会运行子进程

4.map_async()

函数原型:map_async(func, iterable[, chunksize[, callback]])
与map用法一致,但是它是非阻塞的

5.close()

关闭进程池(pool),使其不再接受新的任务

6.terminal()

结束工作进程,不再处理未处理的任务

7.join()

主进程阻塞等待子进程的退出, join方法要在close或terminate之后使用

示例1--使用map()函数

  1. import time
  2. from multiprocessing import Pool
  3. def run(fn):
  4. # fn: 函数参数是数据列表的一个元素
  5. time.sleep(1)
  6. print(fn * fn)
  7. if __name__ == "__main__":
  8. testFL = [1, 2, 3, 4, 5, 6]
  9. print('shunxu:') # 顺序执行(也就是串行执行,单进程)
  10. s = time.time()
  11. for fn in testFL:
  12. run(fn)
  13. t1 = time.time()
  14. print("顺序执行时间:", int(t1 - s))
  15. print('concurrent:') # 创建多个进程,并行执行
  16. pool = Pool(3) # 创建拥有3个进程数量的进程池
  17. # testFL:要处理的数据列表,run:处理testFL列表中数据的函数
  18. pool.map(run, testFL)
  19. pool.close() # 关闭进程池,不再接受新的进程,没有这步会报错
  20. pool.join() # 主进程阻塞等待子进程的退出
  21. t2 = time.time()
  22. print("并行执行时间:", int(t2 - t1))

 

 

运行结果:

1、map函数中testFL为可迭代对象--列表

2、当创建3个进程时,会一次打印出3个结果“1,4,9”,当当创建2个进程时,会一次打印出2个结果“1,4”,以此类推,当创建多余6个进程时,会一次打印出所有结果

3、如果使用Pool(),不传入参数,可以创建一个动态控制大小的进程池

从结果可以看出,并发执行的时间明显比顺序执行要快很多,但是进程是要耗资源的,所以平时工作中,进程数也不能开太大。 对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),让其不再接受新的Process了

  1. #multiprocessing多进程之进程池Pool
  2. import multiprocessing
  3. import time
  4. def func(msg):
  5. print('start:%s' % time.ctime())
  6. print(multiprocessing.current_process().name + '-' + msg)
  7. if __name__ == "__main__":
  8. pool = multiprocessing.Pool(processes=4) # 创建4个进程
  9. for i in range(10):
  10. msg = "hello %d" %(i)
  11. pool.apply_async(func, (msg, ))
  12. pool.close() # 关闭进程池,表示不能在往进程池中添加进程
  13. pool.join() # 等待进程池中的所有进程执行完毕,必须在close()之后调用
  14. print ("Sub-process(es) done.")

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号