python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python多进程 多线程 协程

Python多进程、多线程、协程典型示例解析(最新推荐)

作者:漫谈网络

这篇文章主要介绍了Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、multiprocessing(多进程)

1. 模块简介

2. 案例详解:并行计算平方和

import multiprocessing
import time
# 计算平方的任务函数
def calculate_square(number):
    total = 0
    for n in range(number):
        total += n ** 2
    print(f"计算结果:{total}")
if __name__ == "__main__":  # 必须加这句,否则Windows系统会报错
    # 创建4个进程
    processes = []
    numbers = [10_000_000, 10_000_000, 10_000_000, 10_000_000]  # 四个大数
    # 记录开始时间
    start_time = time.time()
    # 创建并启动进程
    for num in numbers:
        p = multiprocessing.Process(target=calculate_square, args=(num,))
        processes.append(p)
        p.start()  # 启动进程(会立即返回,不会等待完成)
    # 等待所有进程完成
    for p in processes:
        p.join()  # 阻塞主进程,直到子进程结束
    # 计算总耗时
    print(f"总耗时:{time.time() - start_time:.2f}秒")

3. 实现逻辑

主进程(老板)
   │
   ├─ 子进程1(员工1)→ 独立计算
   ├─ 子进程2(员工2)→ 独立计算
   ├─ 子进程3(员工3)→ 独立计算
   └─ 子进程4(员工4)→ 独立计算

4. 注意事项

二、threading(多线程)

1. 模块简介

2. 案例详解:同时下载文件与显示进度条

import threading
import time
import requests
# 全局变量(线程共享)
download_complete = False
def download_file(url):
    global download_complete
    print("开始下载文件...")
    response = requests.get(url)
    with open("bigfile.iso", "wb") as f:
        f.write(response.content)
    download_complete = True
    print("\n下载完成!")
def show_progress():
    while not download_complete:
        print(".", end="", flush=True)  # 不换行输出点
        time.sleep(0.5)
if __name__ == "__main__":
    # 创建两个线程
    download_thread = threading.Thread(
        target=download_file, 
        args=("https://example.com/large-file.iso",)
    )
    progress_thread = threading.Thread(target=show_progress)
    # 启动线程
    download_thread.start()
    progress_thread.start()
    # 等待下载线程完成
    download_thread.join()
    progress_thread.join()  # 需要手动停止进度条线程

3. 实现逻辑

主线程
   │
   ├─ 下载线程 → 执行下载(遇到网络等待时,GIL释放)
   └─ 进度条线程 → 打印进度点

4. 注意事项

三、asyncio(协程)

1. 模块简介

2. 案例详解:异步批量请求网页

import asyncio
import aiohttp  # 需要安装:pip install aiohttp
async def fetch_page(url):
    async with aiohttp.ClientSession() as session:  # 创建会话
        async with session.get(url) as response:    # 发起请求
            return await response.text()           # 异步等待响应
async def main():
    urls = [
        "https://www.baidu.com",
        "https://www.taobao.com",
        "https://www.jd.com"
    ]
    # 创建任务列表
    tasks = [fetch_page(url) for url in urls]
    # 并行执行所有任务
    pages = await asyncio.gather(*tasks)  # 关键点:聚集任务
    # 输出结果
    for url, content in zip(urls, pages):
        print(f"{url} → 长度:{len(content)}")
# 启动事件循环
asyncio.run(main())  # Python 3.7+

3. 实现逻辑

事件循环(总调度员)
   │
   ├─ 任务1:请求百度 → 遇到等待 → 挂起
   ├─ 任务2:请求淘宝 → 遇到等待 → 挂起
   └─ 任务3:请求京东 → 遇到等待 → 挂起
   
当某个请求返回时,恢复对应任务执行

4. 注意事项

三者的核心区别总结

特性multiprocessingthreadingasyncio
并行能力真正多核并行伪并行(受GIL限制)单线程并发
内存占用高(独立内存空间)低(共享内存)最低
适用场景CPU密集型任务I/O密集型任务超高并发I/O任务
代码复杂度中等(需处理进程通信)低(但需处理锁)高(需理解异步语法)

如何选择?

通过这三个案例,可以明显看出:多进程像多个独立工厂,多线程像工厂内多个协作工人,协程则像一个人用超高效的时间管理法。理解这个核心差异后,就能根据实际需求选择合适的工具了。

到此这篇关于Python多进程、多线程、协程典型示例解析的文章就介绍到这了,更多相关Python多进程、多线程、协程典型示例解析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文