Python3.5多进程原理与用法实例分析

yizhihongxing

Python3.5多进程原理与用法实例分析

1. 多进程简介

多进程是一种方式,通过启动多个进程并发执行不同的任务,来提高程序的运行效率。Python中提供了多种方式实现多进程,包括subprocessmultiprocessingos.fork()等,其中multiprocessing是Python自带的一个多进程模块,其封装了底层的C语言模块_multiprocessing,提供了更加易用的多进程编程接口。

2. 多进程基础

2.1 创建进程

创建多个进程可以使用Process类。示例如下:

from multiprocessing import Process

def my_func(arg1, arg2):
    print("arg1:", arg1)
    print("arg2:", arg2)

if __name__ == '__main__':
    p = Process(target=my_func, args=(1, "hello"))
    p.start()
    p.join()

2.2 进程通信

多个进程之间可以进行通信,Python中提供了多种进程通信方式,包括QueuePipeManager等。示例如下:

from multiprocessing import Process, Queue

def worker(q):
    while True:
        item = q.get()
        if item is None:
            break
        print(item)

if __name__ == '__main__':
    q = Queue()
    p = Process(target=worker, args=(q,))
    p.start()

    q.put("hello")
    q.put("world")
    q.put(None)

    p.join()

3. 示例说明

3.1 示例1 - 计算圆周率

基于multiprocessing模块,计算圆周率。示例如下:

from multiprocessing import Process, Queue
import time

def calculate_pi(part_id, total_parts, queue):
    start = int((part_id - 1) * (1 / float(total_parts)) * 1000000 + 1)
    end = int(part_id * (1 / float(total_parts)) * 1000000)

    pi_sum = 0
    sign = 1

    for i in range(start, end + 1):
        pi_sum += sign * (1 / float(i))
        sign *= -1

    queue.put(pi_sum)

if __name__ == '__main__':
    t1 = time.time()
    total_parts = 10
    queue = Queue()

    processes =[Process(target=calculate_pi, args=(i, total_parts, queue)) for i in range(1, total_parts+1)]

    for p in processes:
        p.start()

    results = []
    for p in processes:
        p.join()
        results.append(queue.get())

    t2 = time.time()

    print("pi:", sum(results) * 4)
    print("elapsed time:", t2 - t1)

3.2 示例2 - 多进程下载文件

基于multiprocessing模块,使用多进程下载文件。示例如下:

from multiprocessing import Process, Queue
import os
import requests
import time

def download_file(url, file_path):
    response = requests.get(url, stream=True)
    with open(file_path, 'wb') as f:
        for chunk in response.iter_content(chunk_size=1024):
            if chunk:
                f.write(chunk)

if __name__ == '__main__':
    urls = [
        'http://mirror.centos.org/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Everything-2009.iso',
        'http://releases.ubuntu.com/20.04.2.0/ubuntu-20.04.2.0-desktop-amd64.iso',
        'https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.9.0-amd64-netinst.iso',
        'https://www.freebsd.org/ftp/releases/amd64/amd64/ISO-IMAGES/13.0/FreeBSD-13.0-RELEASE-amd64-disc1.iso'
    ]
    file_names = [os.path.basename(url) for url in urls]

    t1 = time.time()

    queue = Queue()
    processes = [Process(target=download_file, args=(url, file_name)) for url, file_name in zip(urls, file_names)]

    for p in processes:
        p.start()

    for p, file_name in zip(processes, file_names):
        p.join()
        print(file_name, "finished downloading.")

    t2 = time.time()

    print("total elapsed time:", t2 - t1)

以上是两个使用多进程的示例,分别演示了计算圆周率和多进程下载文件的场景。适当使用多进程,可以提高Python程序的运行效率。

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

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • Python创建系统目录的方法

    创建系统目录是Python中非常常见的操作之一。下面我将详细讲解Python创建系统目录的方法,希望对您有所帮助。 方法一:使用os模块 Python自带的os模块提供了操作文件和文件夹的方法,可以使用其中的os.makedirs()函数创建新的目录。 import os # 创建一个新的目录 os.makedirs(‘/Users/username/Doc…

    python 2023年5月30日
    00
  • Redis 如何实现分布式锁的高可用性?

    当多个客户端同时访问 Redis 数据库时,为了保证数据的一致性和可靠性,需要使用分布式锁来控制对数据的访问。Redis 是一款高性能的内存数据库,支持多种数据结构和丰富的功能,其中分布式锁是 Redis 的重要应用场景之一。Redis 如何实现分布式锁的高可用性?本文将为您详细讲解 Redis 分布式锁的实现原理和使用攻略。 Redis 分布式锁的实现原理…

    python 2023年5月12日
    00
  • Python将Excel表格按某列拆分为多个sheet实现过程

    针对“Python将Excel表格按某列拆分为多个sheet”这个需求,一般可以采用以下步骤进行处理: 1.使用Python的pandas库读取Excel表格数据,可以使用read_excel函数。2.根据要拆分的列进行分组,可以使用groupby函数。3.对每个分组创建一个新的Excel sheet,可以使用pandas库的ExcelWriter对象。4.…

    python 2023年6月5日
    00
  • Python enumerate()计数器简化循环

    当我们在使用 Python 进行循环迭代时,可能需要记录当前迭代到第几次循环。这时应该使用 enumerate() 内置函数。enumerate()专门用于将一个可迭代对象中的每个元素对应一个递增的计数器,从而简化循环的过程。 下面是 enumerate() 函数的标准语法: enumerate(sequence, start=0) 该函数接受两个参数:se…

    python 2023年6月3日
    00
  • 深入分析python数据挖掘 Json结构分析

    深入分析Python数据挖掘Json结构分析 什么是JSON? JSON是JavaScript对象表示法的缩写。它是一个轻量级的数据交换格式,被广泛地应用于Web应用中,尤其是在AJAX技术中。JSON以纯文本的形式来描述数据结构,解析起来非常容易,同时也易于阅读和编写。 为什么使用JSON? JSON有很多优点。以下是其中的一些: 易于阅读和编写 – JS…

    python 2023年6月3日
    00
  • 解决python3 整数数组转bytes的效率问题

    解决Python3整数数组转bytes的效率问题可以采用两种方式,分别是原生bytes方法和NumPy库的方式。 原生bytes方法 基础方法 将整数数组转换成bytes。 使用Python内置函数bytes()可以将整数数组转换为bytes类型,示例如下: nums = [1, 2, 3, 4] bytes_data = bytes(nums) 这样就可以…

    python 2023年5月31日
    00
  • Python第三方包之DingDingBot钉钉机器人

    我很乐意给您详细讲解一下“ Python 第三方包之 DingDingBot 钉钉机器人”的使用攻略。 介绍 钉钉机器人是钉钉提供的一个机器人接口,通过该接口可以将自定义信息发送到指定的群或个人中。Python 的第三方库 dingtalk-sdk 就提供了使用钉钉机器人的 API 接口和封装方法,可以方便地将自定义消息传递到钉钉中。 安装 使用 pip 可…

    python 2023年5月23日
    00
  • Python 中 Virtualenv 和 pip 的简单用法详解

    Python中Virtualenv和pip的简单用法详解 什么是Virtualenv Virtualenv是Python的一个环境管理工具,它可以在同一台机器上创建多个Python虚拟环境,每个环境都可以安装自己的Python包,互不影响。使用Virtualenv可以在不同的项目中使用不同版本的Python包,还可以防止出现不同项目之间Python包的版本冲…

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