首页 > 编程语言 >Python 中实现并发编程的常见方式

Python 中实现并发编程的常见方式

时间:2025-01-16 16:01:43浏览次数:3  
标签:futures 函数 concurrent Python 编程 worker 并发 num 线程

一、使用多线程(threading 模块)

解决思路

  1. 导入 threading 模块。
  2. 定义一个函数,该函数将作为线程的执行体。
  3. 创建 Thread 对象,将函数作为参数传递给 Thread 对象。
  4. 调用 start() 方法启动线程。
import threading
import time


def worker(num):
    """线程执行的函数"""
    print(f"Thread {num} starting")
    time.sleep(2)  # 模拟耗时操作
    print(f"Thread {num} finishing")


threads = []
for i in range(5):
    t = threading.Thread(target=worker, args=(i,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()  # 等待所有线程完成

代码解释

  • import threading 导入 Python 的标准库中的 threading 模块,用于创建和管理线程。
  • def worker(num): 定义了一个函数,这个函数将作为线程的执行体,它接收一个参数 num 作为线程的编号。
  • time.sleep(2) 模拟了一个耗时的操作,这里线程会暂停 2 秒钟。
  • threads = [] 创建一个空列表用于存储线程对象。
  • for i in range(5): 循环创建 5 个线程。
  • t = threading.Thread(target=worker, args=(i,)) 创建一个 Thread 对象,将 worker 函数作为目标函数,args=(i,) 为函数传递参数。
  • t.start() 启动线程。
  • t.join() 确保主线程等待子线程完成。

二、使用多进程(multiprocessing 模块)

解决思路

  1. 导入 multiprocessing 模块。
  2. 定义一个函数,该函数将作为进程的执行体。
  3. 创建 Process 对象,将函数作为参数传递给 Process 对象。
  4. 调用 start() 方法启动进程。
import multiprocessing
import time


def worker(num):
    """进程执行的函数"""
    print(f"Process {num} starting")
    time.sleep(2)  # 模拟耗时操作
    print(f"Process {num} finishing")


processes = []
if __name__ == "__main__":
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        processes.append(p)
        p.start()

    for p in processes:
        p.join()  # 等待所有进程完成

代码解释

  • import multiprocessing 导入 Python 的标准库中的 multiprocessing 模块,用于创建和管理进程。
  • def worker(num): 定义了一个函数,这个函数将作为进程的执行体,它接收一个参数 num 作为进程的编号。
  • time.sleep(2) 模拟了一个耗时的操作,这里进程会暂停 2 秒钟。
  • processes = [] 创建一个空列表用于存储进程对象。
  • for i in range(5): 循环创建 5 个进程。
  • p = multiprocessing.Process(target=worker, args=(i,)) 创建一个 Process 对象,将 worker 函数作为目标函数,args=(i,) 为函数传递参数。
  • p.start() 启动进程。
  • p.join() 确保主进程等待子进程完成。

三、使用协程(asyncio 模块)

解决思路

  1. 导入 asyncio 模块。
  2. 定义一个异步函数,使用 async def 关键字。
  3. 在异步函数中使用 await 关键字等待异步操作完成。
  4. 使用 asyncio.run() 函数运行异步函数。
import asyncio


async def worker(num):
    """协程执行的函数"""
    print(f"Coroutine {num} starting")
    await asyncio.sleep(2)  # 模拟耗时操作
    print(f"Coroutine {num} finishing")


async def main():
    tasks = []
    for i in range(5):
        tasks.append(worker(i))
    await asyncio.gather(*tasks)


if __name__ == "__main__":
    asyncio.run(main())

代码解释

  • import asyncio 导入 Python 的标准库中的 asyncio 模块,用于实现异步编程。
  • async def worker(num): 定义了一个异步函数,使用 async 关键字表示该函数是一个协程。
  • await asyncio.sleep(2) 模拟一个耗时的异步操作,使用 await 关键字等待操作完成。
  • async def main(): 定义了一个主协程,用于管理多个协程任务。
  • tasks = [] 创建一个任务列表。
  • for i in range(5): 循环创建 5 个协程任务并添加到任务列表中。
  • await asyncio.gather(*tasks) 并发执行所有任务并等待它们完成。
  • asyncio.run(main()) 运行主协程。

四、使用线程池(concurrent.futures 模块)

解决思路

  1. 导入 concurrent.futures 模块。
  2. 使用 ThreadPoolExecutor 创建一个线程池。
  3. 定义一个函数,该函数将作为线程的执行体。
  4. 调用 submit() 方法将任务提交到线程池。
import concurrent.futures
import time


def worker(num):
    """线程池中的线程执行的函数"""
    print(f"Thread pool worker {num} starting")
    time.sleep(2)  # 模拟耗时操作
    print(f"Thread pool worker {num} finishing")


if __name__ == "__main__":
    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        futures = [executor.submit(worker, i) for i in range(5)]
        for future in concurrent.futures.as_completed(futures):
            future.result()

代码解释

  • import concurrent.futures 导入 Python 的 concurrent.futures 模块,用于创建和管理线程池。
  • def worker(num): 定义了一个函数,作为线程池中的线程执行体。
  • with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: 创建一个最大工作线程数为 5 的线程池。
  • executor.submit(worker, i) 将任务提交到线程池,worker 为任务函数,i 为参数。
  • concurrent.futures.as_completed(futures) 等待所有任务完成,并获取它们的结果。

五、使用进程池(concurrent.futures 模块)

解决思路

  1. 导入 concurrent.futures 模块。
  2. 使用 ProcessPoolExecutor 创建一个进程池。
  3. 定义一个函数,该函数将作为进程的执行体。
  4. 调用 submit() 方法将任务提交到进程池。
import concurrent.futures
import time


def worker(num):
    """进程池中的进程执行的函数"""
    print(f"Process pool worker {num} starting")
    time.sleep(2)  # 模拟耗时操作
    print(f"Process pool worker {num} finishing")


if __name__ == "__main__":
    with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor:
        futures = [executor.submit(worker, i) for i in range(5)]
        for future in concurrent.futures.as_completed(futures):
            future.result()

代码解释

  • import concurrent.futures 导入 Python 的 concurrent.futures 模块,用于创建和管理进程池。
  • def worker(num): 定义了一个函数,作为进程池中的进程执行体。
  • with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor: 创建一个最大工作进程数为 5 的进程池。
  • executor.submit(worker, i) 将任务提交到进程池,worker 为任务函数,i 为参数。
  • concurrent.futures.as_completed(futures) 等待所有任务完成,并获取它们的结果。

根据不同的应用场景和性能要求,可以选择不同的并发编程方式:

  • 多线程适合 I/O 密集型操作,因为 Python 的全局解释器锁(GIL)会限制 CPU 密集型操作的性能提升。
  • 多进程适合 CPU 密集型操作,因为每个进程都有自己的 GIL。
  • 协程适合大量的 I/O 操作,尤其是网络 I/O,因为它使用单线程,避免了线程切换的开销。
  • 线程池和进程池方便管理和复用线程和进程资源,适用于任务数量较多的情况。

标签:futures,函数,concurrent,Python,编程,worker,并发,num,线程
From: https://blog.csdn.net/weixin_51782176/article/details/145184813

相关文章

  • 使用Python爬虫获取1688网站item_get_company API接口的公司档案信息
    一、引言在当今的商业环境中,获取供应商的详细信息对于采购决策、市场分析和供应链管理至关重要。1688作为中国领先的B2B电子商务平台,提供了丰富的供应商档案信息。通过使用1688的item_get_companyAPI接口,我们可以方便地获取这些信息。本文将详细介绍如何使用Python爬虫来调用该A......
  • 使用Python爬虫获取1688网站实力档案信息
    引言1688是阿里巴巴旗下的B2B电子商务平台,提供了丰富的商品和供应商信息。为了获取供应商的实力档案信息,我们可以使用1688的API接口item_get_strength。本文将详细介绍如何使用Python爬虫来调用该API并获取所需信息。环境准备在开始之前,请确保你的系统已经安装了以下工具和库:......
  • 利用Python按关键字搜索阿里巴巴商品:代码示例与实践指南
    在电商领域,能够快速获取商品信息对于市场分析、选品上架、库存管理和价格策略制定等至关重要。阿里巴巴作为全球最大的电商平台之一,提供了丰富的商品数据。虽然阿里巴巴开放平台提供了官方API来获取商品信息,但有时使用爬虫技术来抓取数据也是一种有效的手段。本文将介绍如何利......
  • spring声明事务和编程式事务
    什么是事务?事务是指对数据库中的数据做出一系列操作,事务具有不可分割性、一致性、隔离性和持久性等特征。在Spring框架中,事务管理支持两种方式:声明式事务和编程式事务。编程式事务是指通过手动编写代码来管理事务的提交和回滚。在Spring框架的早期版本中,就已经提供了编程......
  • 利用Python爬虫按图搜索1688商品(拍立淘)的探索之旅
    在当今这个信息爆炸的时代,网购已成为人们生活中不可或缺的一部分。而1688作为国内知名的B2B电商平台,汇聚了海量的商品资源。当我们面对琳琅满目的商品时,传统的文字搜索方式有时会显得力不从心。比如,当你看到一件心仪的商品图片,却不知道该如何用文字准确描述它来搜索时,就会陷入......
  • 用Python管理Docker容器:从`docker-py`到自动化部署的全面指南
    《PythonOpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门!解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界在现代软件开发和运维过程中,Docker容器化技术因其高效、轻量和可移植性而被广泛应用。Python作为一种灵活且功能强大的编程语言,通过docker-py......
  • Python中实现进度条的多种方式
    目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progress库五、使用click库的进度条功能六、自定义进度条类七、结合GUI库实现进度条八、总结在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验。本文将......
  • WRF模式理论讲解,从动力方程、参数化方案及python语言与WRF模式运行结合
    当今从事气象及其周边相关领域的人员,常会涉及气象数值模式及其数据处理,无论是作为业务预报的手段、还是作为科研工具,掌握气象数值模式与高效前后处理语言是一件非常重要的技能。WRF作为中尺度气象数值模式的佼佼者,模式功能齐全,是大部分人的第一选择。而掌握模式还只是第一步,将......
  • Python Wi-Fi密码测试工具
    PythonWi-Fi测试工具相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例,秉着开源精神的想法,望大家喜欢,点个关注不迷路!!!1.简介:这款工具的目的是通过字典攻击方式帮助用户测试Wi-Fi网络的......
  • Linux Shell 脚本编程基础知识篇—sed文本处理工具
    ℹ️大家好,我是练小杰,今天是周三了,距离星期五还有两天......