Python学习笔记之进程池pool

平时很多操作都会用到多进程,比如爬虫数据处理。

下面介绍一下多进程的函数方法参数及使用方法。

目录


需要注意,在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())

效果如下:

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

 

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年6月8日
下一篇 2023年6月8日

相关推荐