Python多进程multiprocessing、进程池用法实例分析

yizhihongxing

Python多进程multiprocessing、进程池用法实例分析

1. 前言

在Python中,我们可以使用线程(threading)和进程(multiprocessing)来实现多任务。相对于线程而言,进程更加稳定、安全,并且能利用多核CPU更充分。

本文将重点讲解Python多进程模块(multiprocessing)和进程池用法实例分析,帮助大家深入了解Python多进程编程的实现细节。

2. Python多进程multiprocessing模块用法

Python中的multiprocessing模块可以轻松实现多进程编程。下面是一段使用multiprocessing实现简单的多进程并发的示例代码:

import multiprocessing

def worker():
    """子进程要执行的函数"""
    print("Worker start")
    print("Worker end")

if __name__ == '__main__':
    print("Main process start")
    p = multiprocessing.Process(target=worker)
    p.start()  # 启动子进程
    p.join()  # 等待子进程完成
    print("Main process end")

其中,multiprocessing.Process可以启动一个子进程,p.start()启动子进程,p.join()等待子进程完成。

2.1 multiprocessing中的进程间通信

使用队列(Queue)可以很方便地实现Python进程间通信。下面是一个简单的例子:

from multiprocessing import Process, Queue

def f(q):
    q.put('hello')

if __name__ == '__main__':
    q = Queue()  # 定义进程共享的队列
    p = Process(target=f, args=(q,))
    p.start()
    print(q.get())  # 从进程共享的队列中读出数据
    p.join()

在这个示例中,我们使用队列Q传递数据。首先,我们需要使用Queue()定义一个共享的队列。然后,我们在子进程中把数据'hello'放入队列中。在主进程中,我们使用q.get()从队列中读取这个数据。最后,我们等待子进程结束。

2.2 multiprocessing中的共享内存

共享内存是多进程编程中非常常见的问题,因为多个进程要共用同一块内存区域。Python中的multiprocessing模块同样可以很好地支持共享内存操作。下面是一个共享内存的示例:

import multiprocessing

def f(n, a):
    n.value = 3.1415926
    for i in range(len(a)):
        a[i] = -a[i]

if __name__ == '__main__':
    num = multiprocessing.Value('d', 0.0)  # 定义共享内存变量num
    arr = multiprocessing.Array('i', range(10))  # 定义共享内存数组arr
    print('Before:', num.value, arr)
    p = multiprocessing.Process(target=f, args=(num, arr))
    p.start()
    p.join()
    print('After:', num.value, arr)

在这个示例中,我们定义了一个共享内存变量num和一个共享内存数组arr。在子进程中,我们把共享内存变量num改为了3.1415926,把共享内存数组中的每个元素都改为了相反数。在主进程中,我们打印出了改变前和改变后的共享内存变量和数组。

3. Python进程池用法实例分析

使用进程池的好处在于可以循环利用多个进程,从而避免了频繁创建和销毁进程的开销。下面是一个可以循环利用进程的简单的进程池的示例(使用multiprocessing.Pool):

import multiprocessing

def f(x):
    return x*x

if __name__ == '__main__':
    with multiprocessing.Pool(processes=4) as pool:  # 定义进程池
        results = pool.map(f, range(10))  # 使用进程池执行f函数
    print(results)

在这个示例中,我们使用了multiprocessing.Pool定义了一个拥有4个进程的进程池。使用pool.map方法执行f函数,得到返回值列表results。

下面再给出一个进程池的实例,使用multiprocessing.Pool复制一个文件夹下的所有文件:

import multiprocessing
import os.path as osp
import shutil

def copy_file(file_path, out_path):
    shutil.copyfile(file_path, osp.join(out_path, osp.basename(file_path)))

def copy_folder(src_folder, out_folder):
    # 在目标文件夹中创建一个与源文件夹相同的文件结构
    dst_folder = osp.join(out_folder, osp.basename(src_folder))
    if not osp.exists(dst_folder):
        shutil.copytree(src_folder, dst_folder)

    # 使用进程池递归复制文件
    with multiprocessing.Pool(processes=multiprocessing.cpu_count()) as pool:
        for root, _, files in os.walk(src_folder):
            for file in files:
                file_path = osp.join(root, file)
                pool.apply_async(copy_file, args=(file_path, dst_folder))
        pool.close()  # 关闭进程池
        pool.join()  # 等待进程池中的所有进程完成

    print(f'Folder {src_folder} copied to {dst_folder} successful!')

if __name__ == '__main__':
    copy_folder('/path/to/src/folder', '/path/to/out/folder')

在这个示例中,我们使用了shutil.copytree递归复制源目录。然后使用进程池multiprocessing.Pool复制源目录下的所有文件:对于每个文件,我们都将其复制到目标目录,并在进程池中并行处理。使用进程池的好处在于可以充分利用多核CPU,从而提高文件复制的速度。

4. 结论

在Python中,使用多进程编程可以很容易地实现并发处理,同时利用多核CPU提高程序处理速度。本文介绍了Python的multiprocessing模块和进程池(multiprocessing.Pool)的基本用法及示例,希望对大家学习Python多进程编程有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python多进程multiprocessing、进程池用法实例分析 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Python正则表达式常用函数总结

    Python正则表达式常用函数总结 正则表达式是一种强大的文本处理工具,可以用于各种文本处理,如数据清洗、文本分析、信息提取等。在Python中我们可以使用re模块提供的函数来操作正则表达式。本攻略将详细讲解Python中正则表达式常用函数的用法,包括re.search()、re.match()、re.findall()和re.sub()。 re.searc…

    python 2023年5月14日
    00
  • Python logging模块原理解析及应用

    Python logging模块原理解析及应用 一、logging模块简介 logging模块是Python自带的标准库,用于输出程序运行时的日志信息。它提供了丰富的功能,可以记录程序的运行状态、错误信息、警告信息等,方便我们在程序运行出问题时进行排查。同时,logging模块还可以将日志信息输出到文件、发送邮件、将日志信息记录到数据库等操作。 loggin…

    python 2023年5月20日
    00
  • Python 中的Sympy详细使用

    Python中的Sympy详细使用攻略 什么是Sympy Sympy是一个符号数学库,它允许您使用符号运算进行数学计算而不是数字运算。符号数学可以帮助您处理复杂的算式和方程,而不是仅仅计算数值结果。 安装Sympy Sympy可以使用pip包管理工具来进行安装,只需要在终端输入如下命令即可: pip install sympy 常见用法 定义符号 在Symp…

    python 2023年5月13日
    00
  • python搭建微信公众平台

    好的!关于“Python搭建微信公众平台”的完整攻略,可以分为以下几个步骤: 注册微信公众平台账号并填写信息(详情可参考官方文档),获得AppID和AppSecret。 安装并初始化WeChat SDK库,可以使用pip安装,示例命令如下: pip install wechat-sdk 安装完毕后,使用以下代码进行初始化: from wechat_sdk i…

    python 2023年6月3日
    00
  • Python中如何引入第三方模块

    在Python中,引入第三方模块是一种常见的操作,可以大大提高程序的开发效率和功能性,下面我将介绍详细的引入第三方模块的攻略。 引入第三方模块的方法 Python引入第三方模块有多种方法,例如: 方法一:使用pip安装 pip是Python的默认包管理器,可以用来方便地安装、升级、卸载第三方模块。使用方法很简单,只需要在命令行输入以下命令: pip inst…

    python 2023年5月18日
    00
  • python正则表达式去掉数字中的逗号(python正则匹配逗号)

    以下是“Python正则表达式去掉数字中的逗号(python正则匹配逗号)”的完整攻略: 一、问题描述 在Python中,我们有时需要去掉数字中的逗号,以便进行数值计算或其他操作。本文将详细讲解如何使用正则表达式去掉数字中的逗号,以及如何在实际开发中应用。 二、解决方案 2.1 去掉数字中的逗号 在Python中,我们可以使用正则表达式来去掉数字中的逗号。具…

    python 2023年5月14日
    00
  • Python实现学校管理系统

    Python实现学校管理系统攻略 简介 学校管理系统通常包括学生信息管理、教师信息管理、课程信息管理、班级信息管理等模块。本文将介绍如何使用Python实现一个简单的学校管理系统。 准备工作 开发学校管理系统需要使用到以下几个方面的知识: Python基础编程知识 数据库基础知识 GUI编程 实现步骤 1. 设计数据库 学校管理系统需要设计数据库来存储学生、…

    python 2023年5月30日
    00
  • Python中str.join()简单用法示例

    这里是关于“Python中str.join()简单用法示例”的完整攻略: 什么是str.join()函数? 在 Python 中,str.join() 是一个字符串方法,可以将字符串列表(或可迭代对象)连接为一个字符串。它接受一个参数,即分隔符,然后将其插入到字符串列表(或可迭代对象)中的每个元素之间。 语法如下: separator.join(iterab…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部