Python多进程multiprocessing用法实例分析

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日

相关文章

  • Python基于Tkinter实现的垃圾分类答题软件代码

    下面是详细讲解基于Tkinter实现的垃圾分类答题软件代码的攻略: 准备工作 首先,需要安装Python和Tkinter库。你可以在Python官网下载安装包,并且在cmd或者终端中使用pip install tkinter来安装Tkinter库。 设计界面 使用Tkinter来创建一个窗口,添加标签、按钮、输入框等控件来实现垃圾分类答题软件的图形界面。其中…

    云计算 2023年5月18日
    00
  • Python利用多进程将大量数据放入有限内存的教程

    如果需要将大量数据(例如超过内存大小的文本文件)读取并进行处理,常用的方式是将数据切分为多份并分别处理,这时多进程可以有效地提高数据处理的效率。以下是Python利用多进程将大量数据放入有限内存的教程攻略: 1. 将数据切分为多份 由于数据过多,我们需要将数据切分为多份,并将每份数据保存为单独的文件,以便于并行处理。可以使用Python的文件操作来完成这一步…

    云计算 2023年5月18日
    00
  • 解析Instagram网站的图片存储架构

    解析Instagram网站的图片存储架构 背景介绍 Instagram是一个为用户分享照片和短视频的社交媒体平台,拥有数亿的用户。每天,数以百万计的照片和视频被上传到该平台并被存储在该平台的服务器上。了解Instagram的图片存储架构是非常有趣的,因为它可以让我们更好地了解它的性能和可扩展性。 总体架构 Instagram的存储架构主要包括两部分:Web服…

    云计算 2023年5月18日
    00
  • 如何用python开发Zeroc Ice应用

    如何用Python开发Zeroc Ice应用 Zeroc Ice是一种高效、灵活、跨平台的RPC框架,支持多种编程语言。在这里,我们将讨论如何使用Python语言开发Zeroc Ice应用程序的方法。 安装Zeroc Ice 在开始编写Python应用程序之前,您需要先安装Zeroc Ice软件包。您可以在Zeroc官网下载最新版本的Ice软件包进行安装。 …

    云计算 2023年5月17日
    00
  • 云娜:从计算、存储角度,谈网易数据治理工具产品实践

    导读:在公司内部,业务线经常面临数据有哪些、质量如何、是否可用、能产生多大价值的困惑,并且,随着数据量的增加,计算和存储资源面临瓶颈。本次将围绕数据治理重点关注的计算、存储等方面,分享数据治理的产品实践。通过分享,一方面可以了解当前业务线主要面临的待治理的数据问题;另一方面,从计算、存储等主要方面,了解数据治理需要重点关注的内容,同时,对数据治理的整体产品实…

    2023年4月9日
    00
  • linux下如何创建守护进程的步骤

    下面是关于“Linux下如何创建守护进程的步骤”的完整攻略,包含两个示例说明。 简介 在Linux系统中,我们可以创建守护进程来在后台运行程序。本攻略中,我们将介绍如何在Linux系统中创建守护进程。 步骤 在Linux系统中创建守护进程时,我们可以通过以下步骤来实现: 创建一个新的进程。 在新进程中调用setsid()函数,使其成为新的会话组长和进程组长。…

    云计算 2023年5月16日
    00
  • C#进阶系列 WebApi身份认证解决方案推荐:Basic基础认证

    下面是关于“C#进阶系列 WebApi身份认证解决方案推荐:Basic基础认证”的完整攻略,包含两个示例说明。 简介 在WebApi开发中,身份认证是一个非常重要的问题。本攻略将介绍WebApi身份认证解决方案之一:Basic基础认证。 Basic基础认证 Basic基础认证是一种简单的身份认证方式,它使用HTTP协议的Authorization头来传递用户…

    云计算 2023年5月16日
    00
  • 全栈混合云综合架构方案研究和落地

    本文分享自天翼云开发者社区《全栈混合云综合架构方案研究和落地》,作者: y****n   (一)业务背景 随着云服务的便利性日益被市场接受,企业客户越来越倾向采用公有云服务补充其现有的企业内部部署的数据中心和私有云基础架构的不足。因此,混合云成为云服务市场的重要发展趋势。广义上讲,混合云的形态可以包括云与云的组合、云与传统IT系统的组合、云与虚拟化技术的组合…

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