Python 并发的意义

  • Post category:Python

Python 并发的意义和使用方法

并发的意义

并发指的是同时执行多个任务。在 Python 中进行并发,通常是为了提高程序的效率和性能。

使用并发可以将不相关的任务独立运行,提高了程序的响应速度,同时减少了系统资源的浪费。

Python 并发的使用方法

在 Python 中实现并发有多种方式,其中比较常用的是以下几种:

1. 线程

线程是操作系统能够进行运算调度的最小单位,它比进程具有更轻量级、更高效的特点。

Python 中的 threading 模块提供了对线程的支持。可以通过继承 threading.Thread 类并重写 run() 方法来创建线程,然后调用 start() 方法实现启动线程。以下是一个示例代码:

import threading

class MyThread(threading.Thread):
    def __init__(self, name):
        super(MyThread,self).__init__()
        self.name = name

    def run(self):
        print("thread start:", self.name)
        print("thread end:", self.name)

for i in range(3):
    thread = MyThread(str(i))
    thread.start()

2. 进程

Python 中的 multiprocessing 模块提供了对进程的支持。与线程不同,进程可以在多个 CPU 上运行,并且可以最大程度地利用系统资源。

使用 multiprocessing.Process 类可以创建进程,然后调用 start() 方法实现启动进程。以下是一个示例代码:

from multiprocessing import Process

def func(name):
    print("process start:", name)
    print("process end:", name)

for i in range(3):
    process = Process(target=func, args=(str(i),))
    process.start()

示例说明

示例1:通过多线程下载文件

多线程可以用于并发下载,从而提高下载速度。以下是一个示例代码:

import requests
import threading

# 下载函数
def download(url, filename):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'}
    res = requests.get(url, headers=headers)
    with open(filename, 'wb') as f:
        f.write(res.content)

# 主函数
if __name__ == '__main__':
    urls = [
        'http://www.example.com/file1.zip',
        'http://www.example.com/file2.zip',
        'http://www.example.com/file3.zip',
    ]
    threads = []
    for i, url in enumerate(urls):
        # 每个文件使用一个线程下载
        thread = threading.Thread(target=download, args=(url, f'file_{i+1}.zip'))
        threads.append(thread)
        thread.start()
    for thread in threads:
        thread.join()

示例2:通过多进程处理数据

多进程可以用于并发处理数据,从而加快处理速度。以下是一个示例代码:

from multiprocessing import Pool

# 处理函数
def func(x):
    return x**2

# 主函数
if __name__ == '__main__':
    data = [1, 2, 3, 4, 5]
    with Pool(2) as pool:
        results = pool.map(func, data)
        print(results)

在这个示例中,Pool(2) 创建了一个包含 2 个进程的进程池,pool.map() 方法将数据列表 data 中的每个元素都传递给处理函数 func() 进行处理,并返回每个元素处理后的结果,最后将结果打印出来。