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