1. # !usr/bin/env python
    2. # -*- coding:utf-8 _*-
    3. """
    4. @Author:何以解忧
    5. @Blog(个人博客地址): https://www.codersrc.com
    6. @Github:www.github.com
    7. @File:python_process_Pool.py
    8. @Time:2020/1/1 21:25
    9. @Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
    10. """
    11. import multiprocessing
    12. import time
    13. def func(msg):
    14. print("in:", msg)
    15. time.sleep(3)
    16. print("out,", msg)
    17. if __name__ == "__main__":
    18. # 这里设置允许同时运行的的进程数量要考虑机器cpu的数量,进程的数量最好别小于cpu的数量,
    19. # 因为即使大于cpu的数量,增加了任务调度的时间,效率反而不能有效提高
    20. pool = multiprocessing.Pool(processes = 3)
    21. item_list = ['processes1' ,'processes2' ,'processes3' ,'processes4' ,'processes5' ,]
    22. count = len(item_list)
    23. for item in item_list:
    24. msg = "python教程 %s" %item
    25. # 维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去
    26. pool.apply_async(func, (msg,))
    27. pool.close()
    28. pool.join() # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束
    29. 输出结果:
    30. in: python教程 processes1
    31. in: python教程 processes2
    32. in: python教程 processes3
    33. out, python教程 processes1
    34. in: python教程 processes4
    35. out, python教程 processes2
    36. in: python教程 processes5
    37. out, python教程 processes3
    38. out, python教程 processes4
    39. out, python教程 processes5

    代码分析:

    5个任务,3个进程,由于在进程池构造的时候允许同时最多执行3个进程,所以同时执行任务1/任务2/任务3,重代码的输出结果来看,任务1/任务2/任务3执行后,for循环进入阻塞状态,直到任务1/任务2/任务3其中一个结束之后才会for才会继续执行任务4/任务5,并保证同时执行的最多只有3个任务( 进程池multiprocessing.Pool 和 线程池ThreadPoolExecutor 原理相同)