Python多进程multiprocessing用法实例分析

yizhihongxing

Python多进程multiprocessing用法实例分析

本文将详细介绍Python内置库multiprocessing的用法,包括创建进程、进程间通信以及进程池等方面,同时会提供两个示例来帮助读者更好地理解使用multiprocessing进行并发编程的思想。

创建进程

Python的multiprocessing库提供了Process类来创建进程。以下是一个示例:

import multiprocessing

def foo():
    print('Process {}: hello, world!'.format(multiprocessing.current_process().name))

if __name__ == '__main__':
    p = multiprocessing.Process(target=foo)
    p.start()
    p.join()

在该示例中,我们通过调用multiprocessing.Process来创建一个新的进程,在target参数中指定要运行的函数。start()方法会使进程开始执行,join()方法则会等待进程执行完毕后才会继续执行当前进程。

进程间通信

在多进程编程中,进程间通信是非常重要的一部分。Python提供了多个用于实现进程间通信的方法,例如QueuePipeshared memory等。

以下是一个基于Pipe的示例:

import multiprocessing

def sender(conn):
    conn.send('hello from sender')
    conn.close()

def receiver(conn):
    msg = conn.recv()
    print('Process {}: received {}'.format(multiprocessing.current_process().name, msg))
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = multiprocessing.Pipe()
    p1 = multiprocessing.Process(target=sender, args=(child_conn,))
    p2 = multiprocessing.Process(target=receiver, args=(parent_conn,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

在该示例中,我们通过调用multiprocessing.Pipe来创建一个管道,并将它分成父进程和子进程两端。sender函数向管道写入一条消息,receiver函数从管道中读取消息并打印。在主进程中,我们创建了两个进程来代表管道的两端,并启动它们。最后,我们等待两个进程执行完毕,释放资源。

进程池

进程池是一种非常常用的并发编程方法,通过预先创建一组进程然后通过任务调度来共享它们来实现并发。Python中,multiprocessing.Pool提供了进程池接口。

以下是一个进程池的示例:

import multiprocessing

def worker(num):
    print('Process {} is working on task {}'.format(multiprocessing.current_process().name, num))
    return num * 2

if __name__ == '__main__':
    nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    with multiprocessing.Pool(processes=3) as pool:
        results = pool.map(worker, nums)
    print(results)

在该示例中,我们将函数worker作为任务提交到进程池中执行,并将所用到的参数传递给map方法(相当于Python内置函数map),等待所有任务执行完成后,我们会得到所有任务的返回结果。

示例1

假设我们需要对列表中的元素进行一个昂贵的计算,同时希望可选择地使用并发来加速计算,以下是示例代码:

import time
import multiprocessing

def do_expensive_calculations(num):
    time.sleep(1)  # 模拟一些昂贵的计算
    return num ** 2

if __name__ == '__main__':
    nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    use_multiprocessing = True  # 是否使用多进程
    results = []

    if use_multiprocessing:
        with multiprocessing.Pool(processes=3) as pool:
            results = pool.map(do_expensive_calculations, nums)
    else:
        for n in nums:
            results.append(do_expensive_calculations(n))

    print(results)

在该示例中,我们可以通过设置use_multiprocessing变量来选择是否使用多进程运行。在使用多进程时,我们需要构建一个进程池并等待它完成工作。

示例2

假设我们需要运行两个相互独立的长时间任务,以下是示例代码:

import time
import multiprocessing

def task1():
    time.sleep(3)
    print('Task 1 finished')

def task2():
    time.sleep(5)
    print('Task 2 finished')

if __name__ == '__main__':
    p1 = multiprocessing.Process(target=task1)
    p2 = multiprocessing.Process(target=task2)

    p1.start()
    p2.start()

    p1.join()
    p2.join()

    print('All tasks finished')

在该示例中,我们使用multiprocessing.Process创建两个独立的进程来运行task1task2函数,等待它们完成后再继续运行。同时,我们将task1task2的运行时间设置不同来模拟两个相互独立的长时间任务的情况。

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

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

相关文章

  • Javascript & DHTML 实例编程(教程)DOM基础和基本API

    本教程主要介绍了Javascript和DHTML的实例编程,并深入讲解了DOM(文档对象模型)的基础和基本API。 简介 DOM是一种表示和操作HTML和XML文档的标准接口。通过DOM,程序可以访问和操作文档的内容、结构和样式。 DOM基础包括节点、元素、属性和文本等概念。基本API包括获取元素、添加节点、修改文本和样式等方法。 本教程主要包含以下内容: …

    云计算 2023年5月17日
    00
  • Python全局变量与局部变量区别及用法分析

    Python全局变量与局部变量区别及用法分析 在Python中,全局变量和局部变量是我们常常使用的两种变量类型。全局变量是指在整个程序中都有效的变量,而局部变量则只在特定范围内有效。本文将详细介绍Python全局变量和局部变量的区别及用法,帮助您更好地理解和应用这两种变量类型。 全局变量和局部变量的区别 全局变量和局部变量的主要区别在于它们所在的作用域不同。…

    云计算 2023年5月18日
    00
  • angular6根据environments配置文件更改开发所需要的环境的方法

    在 Angular6 中,我们可以使用 environments 配置文件来配置不同的环境变量,例如开发环境、测试环境和生产环境等。在本文中,我们将详细讲解如何根据 environments 配置文件更改开发所需要的环境。 步骤 1. 创建 environments 配置文件 在 Angular6 项目中,我们可以通过在 src 目录下创建 environm…

    云计算 2023年5月16日
    00
  • 云计算与OpenStack(虚拟机Nova篇)

    《云计算与OpenStack(虚拟机Nova篇)》 基本信息 作者: 伯龙 程志鹏 张杰 出版社:电子工业出版社 ISBN:9787121201202 上架时间:2013-8-5 出版日期:2013 年9月 开本:16开 页码:324 版次:1-1 所属分类:计算机 更多关于 》》》《云计算与OpenStack(虚拟机Nova篇)》 内容简介 计算机书籍  …

    云计算 2023年4月11日
    00
  • JAVA使用ElasticSearch查询in和not in的实现方式

    当我们使用Java对Elasticsearch进行查询时,经常会涉及到in和not in这两种条件查询,本文将介绍如何使用Java实现这两种条件查询。 Elasticsearch in查询的实现 首先,我们需要导入相关的依赖库: <dependency> <groupId>org.elasticsearch.client</gr…

    云计算 2023年5月17日
    00
  • .NET 6新增的20个API介绍

    下面我来详细讲解“.NET 6新增的20个API介绍”的完整攻略。 1. 前言 在.NET 6中,添加了许多新的API,这些API覆盖了不同的领域,可以更容易地开发不同类型的Web和桌面应用程序。本文将向您介绍.NET 6中新增的20个API。 2. 新增的20个API 2.1. HttpClientJsonExtensions 在.NET 6中,为HTTP…

    云计算 2023年5月17日
    00
  • openstack私有云布署实践【11.1 计算nova – compute节点配置(科兴环境)】

    这里我只使用kxcompute1节点配置为示例,其它节点的配置基本是一样的,只是声明的管理IP不同而已   计算节点 # yum install openstack-nova-compute sysfsutils   修改配置文件 vi /etc/nova/nova.conf   [DEFAULT] vcpu_pin_set = 4-31 resume_gu…

    云计算 2023年4月10日
    00
  • Redis的Python客户端redis-py安装使用说明文档

    Redis是一款开源的内存数据结构存储系统,它支持多种数据结构(如字符串、哈希表等),而redis-py则是Redis的Python客户端,可以帮助我们更方便地在Python中使用Redis。 本文将详细讲解redis-py的安装和使用说明,包括以下内容: 安装redis-py 连接Redis数据库 使用Redis数据库 redis-py的常用命令 示例说明…

    云计算 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部