百木园-与人分享,
就是让自己快乐。

Python 进程池 multiprocessing.Pool - Python零基础入门教程

目录

  • 一.Python 进程池 multiprocessing.Pool 介绍
  • 二.Python 进程池 multiprocessing.Pool 使用
  • 三.猜你喜欢

零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门

Python 进程池 Pool 和前面讲解的** Python 线程池** 类似,虽然使用多进程能提高效率,但是进程的创建会消耗大量的计算机资源(进程 Process 的创建远远大于线程 Thread 创建占用的资源),线程是计算机最小的运行单位**,连线程都需要使用线程池,进程有什么理由不使用进程池?

需要注意的是,在 Windows 上要想使用进程模块,就必须把有关进程的代码写在if __name__ == ‘__main__’ 内,否则在 Windows 下使用进程模块会产生异常。 Unix / Linux 下则不需要。

一.Python 进程池 multiprocessing.Pool 介绍

Pool 类可以提供指定数量的进程供用户调用,当有新的请求提交到 Pool 中时,如果池还没有满,就会创建一个新的进程来执行请求。如果池满,请求就会告知先等待,直到池中有进程结束,才会创建新的进程来执行这些请求。

# 导入进程模块

import multiprocessing

# 最多允许3个进程同时运行

pool = multiprocessing.Pool(processes = 3)

1、apply — 该函数用于传递不定参数,主进程会被阻塞直到函数执行结束(不建议使用,并且 3.x 以后不在出现),函数原型如下:

apply(func, args=(), kwds={})

**2、apply_async **— 与 apply 用法一致,但它是非阻塞的且支持结果返回后进行回调,函数原型如下:

apply_async(func[, args=()[, kwds={}[, callback=None]]])

3、map — Pool 类中的 map 方法,与内置的 map 函数用法基本一致,它会使进程阻塞直到结果返回,函数原型如下:

map(func, iterable, chunksize=None)

注意:虽然第二个参数是一个迭代器,但在实际使用中,必须在整个队列都就绪后,程序才会运行子进程。

**4、map_async **— 与 map 用法一致,但是它是非阻塞的。其有关事项见 apply_async,函数原型如下:

map_async(func, iterable, chunksize, callback)

5、close — 关闭进程池(pool),使其不在接受新的任务。

6、terminal — 结束工作进程,不在处理未处理的任务。

7、join — 主进程阻塞等待子进程的退出, join 方法要在 close 或 terminate 之后使用。

二.Python 进程池 multiprocessing.Pool 使用

# !usr/bin/env python
# -*- coding:utf-8 _*-
\"\"\"
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 进程池 multiprocessing.Pool.py
@Time:2021/05/09 07:37
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

\"\"\"

import multiprocessing
import time

def func(msg):
print(\"in:\", msg)
time.sleep(3)
print(\"out,\", msg)

if __name__ == \"__main__\":
# 这里设置允许同时运行的的进程数量要考虑机器cpu的数量,进程的数量最好别小于cpu的数量,
# 因为即使大于cpu的数量,增加了任务调度的时间,效率反而不能有效提高
pool = multiprocessing.Pool(processes = 3)
item_list = [\'processes1\' ,\'processes2\' ,\'processes3\' ,\'processes4\' ,\'processes5\' ,]
count = len(item_list)
for item in item_list:
msg = \"python教程 %s\" %item
# 维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去
pool.apply_async(func, (msg,))

pool.close()
pool.join() # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束

\'\'\'
输出结果:

in: python教程 processes1
in: python教程 processes2
in: python教程 processes3
out, python教程 processes1
in: python教程 processes4
out, python教程 processes2
in: python教程 processes5
out, python教程 processes3
out, python教程 processes4
out, python教程 processes5
\'\'\'

代码分析:

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

三.猜你喜欢

  • Python 条件推导式
  • Python 列表推导式
  • Python 字典推导式
  • Python 不定长参数 *argc/**kargcs
  • Python 匿名函数 lambda
  • Python return 逻辑判断表达式
  • Python is 和 == 区别
  • Python 可变数据类型和不可变数据类型
  • Python 浅拷贝和深拷贝
  • Python 异常处理
  • Python 线程创建和传参
  • Python 线程互斥锁 Lock
  • Python 线程时间 Event
  • Python 线程条件变量 Condition
  • Python 线程定时器 Timer
  • Python 线程信号量 Semaphore
  • Python 线程障碍对象 Barrier
  • Python 线程队列 Queue – FIFO
  • Python 线程队列 LifoQueue – LIFO
  • Python 线程优先队列 PriorityQueue
  • Python 线程池 ThreadPoolExecutor(一)
  • Python 线程池 ThreadPoolExecutor(二)
  • Python 进程 Process 模块
  • Python 进程 Process 与线程 threading 区别
  • Python 进程间通信 Queue / Pipe
  • 未经允许不得转载:猿说编程 » Python 进程池 multiprocessing.Pool

    本文由博客 - 猿说编程 猿说编程 发布!

    来源:https://www.cnblogs.com/shuopython/p/14965636.html
    图文来源于网络,如有侵权请联系删除。

    未经允许不得转载:百木园 » Python 进程池 multiprocessing.Pool - Python零基础入门教程

    相关推荐

    • 暂无文章