• Python学习笔记之进程池pool


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

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

    目录

    一.进程池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类可以提供指定数量的进程供用户调用,当有新的请求提交到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函数会将参数一个个的传递到调用的函数中。

    1. # -*- coding: UTF-8 -*-
    2. from multiprocessing import Pool
    3. # 要在调用进程池执行的函数
    4. def func(num):
    5. print("echo:", num)
    6. if __name__ == '__main__':
    7. # 进程池最大运行数 不设置则为电脑所有cpu
    8. p = Pool(processes=4)
    9. # 模拟并发调用线程池
    10. i = [i for i in range(10)]
    11. p.map(func, i)

    效果如下:

    2.apply_async用法

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

     效果如下:

    3.进程池调用后返回结果

    1. # -*- coding: UTF-8 -*-
    2. from multiprocessing import Pool
    3. def func(num):
    4. return num
    5. if __name__ == '__main__':
    6. p = Pool(processes=4)
    7. # 申明一个列表,用来存放各进程返回的结果
    8. result_list = []
    9. for i in range(10):
    10. # 将返回结果append到列表中
    11. result_list.append(p.apply_async(func, [i]))
    12. # 循环读出列表返回的结果
    13. for res in result_list:
    14. print("num %d" % res.get())

    效果如下:

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

     

  • 相关阅读:
    有个前辈把牛客网的Java面试笔记在GitHub开源了
    Java SPI 机制源码级深度理解
    Embedding
    cpu训练仍然提示gpu显存不够的可能原因
    CommandInvokationFailure: Gradle build failed.
    DAQ高频量化平台:引领Ai高频量化交易模式变革
    上传镜像到 docker hub 中
    c#对接webservice接口
    高通SDX12:USB主模式调试及RTL8153驱动移植
    Vue路由与nodes的环境配置
  • 原文地址:https://blog.csdn.net/json_ligege/article/details/128084636