详解python之多进程和进程池(Processing库)

详解Python之多进程和进程池

一、多进程概念

进程是系统资源分配的最小单位,一个进程可以有多个线程,这些线程共享进程的内存空间和系统资源。在Python中,可以通过multiprocessing模块实现多进程的功能。

二、多进程的好处

  1. 充分利用多核CPU,提升程序运行效率;
  2. 进程之间独立,一个进程挂掉不会影响其他进程的运行;
  3. 可以利用操作系统的进程管理机制,避免出现死锁现象。

三、多进程的实现方式

3.1 普通多进程

使用multiprocessing模块的Process类可以实现简单的多进程,示例代码如下:

from multiprocessing import Process

def func():
    print('子进程执行')

if __name__ == '__main__':
    p = Process(target=func)
    p.start()
    p.join()
    print('主进程执行')

代码解析:

  1. 通过multiprocessing模块的Process类创建子进程,并指定执行函数为func()
  2. 子进程通过调用指定的函数进行任务处理;
  3. 主进程通过p.join()方法等待子进程执行完毕,再执行后续代码。

3.2 进程池

使用进程池可以避免频繁创建和销毁进程,从而提高程序的执行效率。使用multiprocessing模块的Pool类可以实现进程池,示例代码如下:

from multiprocessing import Pool
import os
import time

def func(n):
    print(f'子进程{os.getpid()}执行{n}')
    time.sleep(1)
    return n

if __name__ == '__main__':
    p = Pool(3)
    results = p.map(func, range(10))
    print(results)

代码解析:

  1. 通过multiprocessing模块的Pool类创建进程池,并指定最大进程数为3,即同时运行3个子进程;
  2. 子进程通过调用指定的函数进行任务处理,这里模拟了任务处理需要一定时间的情况;
  3. 主进程通过p.map()方法向进程池中添加任务,并等待任务执行完毕;
  4. p.map()方法返回一个结果集,结果集的元素按照任务添加的顺序排列。

四、总结

多进程和进程池是Python中实现并行计算的重要方式,能够充分利用多核CPU提高程序运行效率。multiprocessing模块是Python标准库中提供的多进程处理模块,使用简单,功能强大,值得掌握和使用。

五、示例

5.1 利用进程池进行网络爬虫

利用Python的并行计算,可以有效提升网络爬虫的效率。下面是一个简单的示例:

import requests
from bs4 import BeautifulSoup
from multiprocessing import Pool

def get_url(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.content)
    title = soup.select_one('title').text
    return title

if __name__ == '__main__':
    urls = ['https://www.baidu.com', 'https://www.google.com', 'https://www.bing.com']
    p = Pool(len(urls))
    results = p.map(get_url, urls)
    print(results)

代码解析:

  1. get_url()函数中通过requestsBeautifulSoup模块获取网页标题;
  2. 在主程序中创建进程池,并向进程池中添加子进程任务;
  3. p.map()方法返回所有子进程处理的结果。

5.2 利用多进程进行图片下载

多进程能够大大提高图片的下载效率,下面是一个简单的示例:

import requests
from multiprocessing import Process

def download(image_url, path):
    response = requests.get(image_url)
    with open(path, 'wb') as f:
        f.write(response.content)

if __name__ == '__main__':
    urls = [
        ('https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png', 'google.png'),
        ('https://www.baidu.com/img/bd_logo1.png', 'baidu.png')
    ]
    processes = [Process(target=download, args=(url[0], url[1])) for url in urls]
    for process in processes:
        process.start()
    for process in processes:
        process.join()

代码解析:

  1. download()函数中通过requests模块下载图片,并保存到指定路径;
  2. 在主程序中创建多个子进程,并将每个子进程的任务指定为下载指定的图片;
  3. 通过循环遍历所有子进程,并对其进行启动和等待。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解python之多进程和进程池(Processing库) - Python技术站

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

相关文章

  • Python全面分析系统的时域特性和频率域特性

    Python全面分析系统的时域特性和频域特性攻略 1. 什么是时域特性和频率域特性? 时域特性:描述系统输出相对于输入的时间响应特性,涉及信号的时间变化过程和振幅大小等。 频率域特性:描述输入信号在系统中的频率响应特性,即输出与输入信号的振幅比例和相位差随频率变化的规律。 2. 如何分析时域特性? 2.1 生成输入信号 通过NumPy库的numpy.lins…

    python 2023年5月30日
    00
  • 详解Python 用字典模拟switch-case语句

    首先需要注意的是,Python是一门没有提供switch-case语句的语言。不过,可以使用字典模拟switch-case语句,实现类似的功能。下面介绍具体操作步骤: 1. 定义字典并赋初值 为了模拟switch-case语句,需要定义一个字典来存储对应的case和其对应的操作。其中,case是字典的键,对应的操作是字典的值。需要使用lambda表达式来定义…

    python-answer 2023年3月25日
    00
  • 如何使用python数据处理解决数据冲突和样本的选取

    使用Python数据处理解决数据冲突和样本的选取可以通过以下步骤实现: 1. 数据冲突的解决在数据处理中,冲突是一个常见的问题。如何解决该问题是实现数据处理的重要一步。以下是解决数据冲突的步骤: 导入数据:首先需要导入数据,可以使用pandas库中的read_csv()函数导入csv文件或者read_excel()函数导入Excel文件。 检查数据:在导入数…

    python 2023年6月5日
    00
  • python基础编程小实例之计算圆的面积

    Python基础编程小实例之计算圆的面积 1. 实现思路 计算圆的面积,需要用到圆的半径和圆周率。圆周率常用的取值是3.14159,而半径需要用户输入。然后根据圆的面积公式$S=\pi\times r^2$,计算出圆的面积值。 2. 实现步骤 2.1 输入半径 首先需要让用户输入圆的半径,可以使用input()函数获取用户输入的半径值,并将其转换为浮点型数值…

    python 2023年6月3日
    00
  • 操作Windows注册表的简单的Python程序制作教程

    下面是详细讲解“操作Windows注册表的简单的Python程序制作教程”的完整攻略: 前言 在Windows中,注册表是一种用于存储系统和应用程序信息的重要工具。Python是一种功能强大的编程语言,可以轻松地操作注册表。本教程将向您展示如何制作一个简单的Python程序,以便使用Python操作Windows注册表。 步骤 步骤1:导入必要的库 我们首先…

    python 2023年5月31日
    00
  • python进阶教程之词典、字典、dict

    下面我会为您详细讲解“python进阶教程之词典、字典、dict”的完整攻略。 1. 什么是字典? 在Python中,字典是一种可变集合,用于存储键值对。每个键必须是唯一的(在一个字典中),但是多个键可以指向相同的值。字典的键是不可变的(例如,数字、字符串或元组),而值可以是任何类型的Python对象。 字典可以通过 {} 或 dict() 函数创建,并且支…

    python 2023年5月13日
    00
  • 浅谈python中常用的8种经典数据结构

    下面是关于“浅谈Python中常用的8种经典数据结构”的完整攻略: 一、列表(List) 列表是Python中最常用的数据结构之一。它是一个有序的、可修改的集合,可以容纳不同类型的元素。使用中括号将元素括起来,每个元素之间用逗号隔开。 1. 如何创建一个列表 my_list = [1, 2, 3, ‘a’, ‘b’, ‘c’] print(my_list) …

    python 2023年5月13日
    00
  • 浅析豆瓣网站运营的主要技术模式

    浅析豆瓣网站运营的主要技术模式 豆瓣网是一个集社交、文化娱乐等多功能于一身的网站。网站运营以用户为中心,通过优化用户体验、提升用户黏性等方法来增加用户粘性,进而提高网站的活跃度和用户增长率。下面从豆瓣网站的主要技术模式出发,对其网站运营进行浅析。 技术模式一:数据洞察 豆瓣网站通过不断收集用户数据并加以分析,发现其用户群体兴趣多样化,范围越来越广,这促使网站…

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