python:并发编程(六)

前言

本文将和大家一起探讨python的多进程并发编程(下篇),使用内置基本库multiprocessing来实现并发,先通过官方来简单使用这个模块。先打好基础,能够有个基本的用法与认知,后续文章,我们再进行详细使用。

本文为python并发编程的第六篇,上一篇文章地址如下:

python:并发编程(五)_Lion King的博客-CSDN博客

下一篇文章地址如下:

python:并发编程(七)_Lion King的博客-CSDN博客

一、实战

1、使用多进程实现并发下载多个文件,并在下载完成后统计总下载时间

import multiprocessing
import requests
import time

def download_file(url, output_file):
    response = requests.get(url)
    with open(output_file, 'wb') as file:
        file.write(response.content)

if __name__ == '__main__':
    urls = [
        'https://so.gushiwen.cn/gushi/sanbai.aspx',
        'https://so.gushiwen.cn/gushi/tangshi.aspx',
        'https://so.gushiwen.cn/gushi/songsan.aspx',
        # 根据需要添加更多的下载链接
    ]

    start_time = time.time()

    # 创建一个进程池
    pool = multiprocessing.Pool()

    # 并发地下载文件
    for i, url in enumerate(urls):
        output_file = f'file{i+1}.txt'
        pool.apply_async(download_file, (url, output_file))

    # 关闭进程池并等待所有进程完成
    pool.close()
    pool.join()

    end_time = time.time()
    total_time = end_time - start_time

    print(f'共下载了 {len(urls)} 个文件,总耗时 {total_time:.2f} 秒。')

在此示例中,我们使用multiprocessing.Pool创建了一个进程池,然后使用apply_async方法异步地将下载任务提交给进程池中的工作进程。每个工作进程负责下载一个文件。通过这种方式,我们可以并发地下载多个文件,提高下载效率。上述代码解释如下:

(1)import multiprocessing: 导入multiprocessing模块,用于创建和管理进程。

(2)import requests: 导入requests模块,用于发送HTTP请求并下载文件。

(3)import time: 导入time模块,用于计算程序执行时间。

(4)def download_file(url, output_file): 定义一个函数download_file,用于下载指定URL的文件并保存到指定的输出文件中。

(5)if __name__ == '__main__':: 主程序入口,确保代码在主进程中执行。

(6)urls = [...]: 定义一个包含待下载文件URL的列表。

(7)start_time = time.time(): 记录程序开始执行的时间。

(8)pool = multiprocessing.Pool(): 创建一个进程池。

(9)for i, url in enumerate(urls):: 遍历下载URL列表。

(10)output_file = f'file{i+1}.txt': 根据文件索引号生成输出文件名。

(11)pool.apply_async(download_file, (url, output_file)): 使用apply_async方法异步地将下载任务提交给进程池中的工作进程。

(12)pool.close(): 关闭进程池,不再接受新的任务。

(13)pool.join(): 等待所有工作进程完成。

(14)end_time = time.time(): 记录程序执行结束的时间。

(15)total_time = end_time - start_time: 计算总的下载时间。

(16)print(f'共下载了 {len(urls)} 个文件,总耗时 {total_time:.2f} 秒。'): 打印下载文件数量和总下载时间的信息。

请注意,这是一个简单的示例,没有考虑异常处理、错误处理和进一步优化的细节。在实际应用中,你可能需要根据具体需求进行适当的修改和扩展。

2、使用多进程实现并行计算斐波那契数列的前n个数

import multiprocessing

def fibonacci(n):
    if n <= 0:
        return []
    elif n == 1:
        return [0]
    elif n == 2:
        return [0, 1]

    fib = [0, 1]
    for i in range(2, n):
        fib.append(fib[-1] + fib[-2])

    return fib

if __name__ == '__main__':
    n = 100  # 斐波那契数列的前n个数

    # 创建进程池,根据CPU核心数量自动设置进程数
    pool = multiprocessing.Pool()

    # 使用进程池并行计算斐波那契数列
    result = pool.map(fibonacci, [n])

    # 关闭进程池
    pool.close()
    pool.join()

    print(f'斐波那契数列的前{n}个数为:{result[0]}')

该程序使用multiprocessing.Pool创建了一个进程池,并使用map方法并行计算斐波那契数列的前n个数。进程池会自动根据计算机的CPU核心数量来设置进程数,以充分利用多核资源。最后,打印出计算结果。

请注意,该程序中斐波那契数列的计算是在不同的进程中并行执行的,从而提高了计算效率。

3、使用多进程实现并发地计算给定列表中所有元素的平方和

import multiprocessing

def square_sum(numbers):
    total = 0
    for num in numbers:
        total += num**2
    return total

if __name__ == '__main__':
    numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  # 给定的列表

    # 创建进程池,根据CPU核心数量自动设置进程数
    pool = multiprocessing.Pool()

    # 使用进程池并行计算平方和
    result = pool.apply(square_sum, (numbers,))

    # 关闭进程池
    pool.close()
    pool.join()

    print(f'给定列表中所有元素的平方和为:{result}')

该程序使用multiprocessing.Pool创建了一个进程池,并使用apply方法并行计算给定列表中所有元素的平方和。进程池会自动根据计算机的CPU核心数量来设置进程数,以充分利用多核资源。最后,打印出计算结果。

请注意,该程序中给定列表的元素平方和的计算是在不同的进程中并行执行的,从而提高了计算效率。

二、multiprocessing模块主要功能

1、使用Pool对象创建进程池

Pool对象提供了一种简单的方式来管理和调度进程,可以使用applymapimap等方法来并发执行任务。

2、使用Process对象创建单个进程

如果需要更细粒度地控制进程的创建和管理,可以使用Process对象来创建和管理单个进程。

3、使用Queue进行进程间通信

Queue是进程安全的队列,可以在多个进程之间安全地传递数据。它可以用于实现进程间的通信和数据共享。

4、使用Lock进行进程间同步

Lock对象用于实现进程间的同步,防止多个进程同时访问共享资源,确保数据的正确性。

5、使用ValueArray实现进程间共享状态

ValueArray是用于在多个进程之间共享数据的对象,可以通过它们来实现进程间的共享状态。

6、使用Manager对象管理共享状态

Manager对象提供了一种更高级的方式来管理共享状态,它可以创建和管理多个共享对象,如列表、字典等,并确保它们在多个进程之间的安全访问。

7、使用Event进行进程间同步

Event对象用于实现进程间的同步,它可以用于多个进程之间的事件触发和等待。

8、使用Semaphore进行进程间同步

Semaphore对象是一种计数信号量,用于控制对共享资源的访问,可以用于限制同时访问共享资源的进程数。

9、使用Timeout设置超时

Timeout对象可以用于设置对某个操作的超时时间,确保在指定时间内完成操作,避免进程阻塞或无限等待。

10、使用Pipe进行进程间通信

Pipe提供了一种进程间的双向通信机制,可以在两个进程之间传递数据。

猜你喜欢

转载自blog.csdn.net/weixin_43431593/article/details/131227672
今日推荐