平时很多操作都会用到多进程,比如爬虫、数据处理。
下面介绍一下多进程的函数方法、参数及使用方法。
目录
一.进程池Pool介绍
1.apply()
2.apply_async
3.map()
4.map_async()
5.close()
6.terminal()
7.join()
二.进程池Pool使用
1.map用法
2.apply_async用法
3.进程池调用后返回结果
需要注意,在Windows上使用进程模块,
必须把有关进程的代码写在
if __name__ == “__main__”:
语句的下面,才能正常使用Windows下的进程模块,否则会报错。
Unix/Linux下则不需要。
Pool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果池还没有满,就会创建一个新的进程来执行请求。如果池满,请求就会告知先等待,直到池中有进程结束,才会创建新的进程来执行这些请求。
下面介绍一下multiprocessing 模块下的Pool类下的几个方法:
函数原型:apply(func[, args=()[, kwds={}]])
该函数用于传递不定参数,同python中的apply函数一致,主进程会被阻塞直到函数执行结束
函数原型:apply_async(func[, args=()[, kwds={}[, callback=None]]])
与apply用法一致,但它是非阻塞的且支持结果返回后进行回调。
函数原型:map(func, iterable[, chunksize=None])
与内置的map函数用法行为基本一致,它会使进程阻塞直到结果返回。
注意:虽然第二个参数是一个迭代器,但在实际使用中,必须在整个队列都就绪后,程序才会运行子进程。
函数原型:map_async(func, iterable[, chunksize[, callback]])
与map用法一致,但是它是非阻塞的。
关闭进程池(pool),使其不在接受新的任务。
结束工作进程,不在处理未处理的任务。
主进程阻塞等待子进程的退出, join方法要在close或terminate之后使用。
map函数第一个参数是要调用的函数名不带括号,第二个参数是一个可迭代的参数,map函数会将参数一个个的传递到调用的函数中。
# -*- coding: UTF-8 -*-
from multiprocessing import Pool# 要在调用进程池执行的函数
def func(num):print("echo:", num)if __name__ == '__main__':# 进程池最大运行数 不设置则为电脑所有cpup = Pool(processes=4)# 模拟并发调用线程池i = [i for i in range(10)]p.map(func, i)
效果如下:

# -*- coding: UTF-8 -*-
from multiprocessing import Pooldef func(num1):print("echo %d" % num1)if __name__ == '__main__':p = Pool(processes=4)for i in range(10):p.apply_async(func, (i,))# 调用join之前,先调用close函数,否则会出错。# 执行完close后不会有新的进程加入到pool# join函数等待所有子进程结束p.close()p.join()
效果如下:

# -*- coding: UTF-8 -*-
from multiprocessing import Pooldef func(num):return numif __name__ == '__main__':p = Pool(processes=4)# 申明一个列表,用来存放各进程返回的结果result_list = []for i in range(10):# 将返回结果append到列表中result_list.append(p.apply_async(func, [i]))# 循环读出列表返回的结果for res in result_list:print("num %d" % res.get())
效果如下:

就写到这里吧,如有不足,望指正!