当前位置: 首页 > news >正文

python多线程介绍

每个库或模块都有其特定的用途和优势,选择哪一个取决于具体的任务需求、计算资源。一般可以将任务分成两类:

  • I/O 密集型任务:这些任务的瓶颈主要在于等待外部操作,如磁盘读写或网络通信。在这些等待期间,CPU 大部分时间是空闲的。线程由于其轻量级特性,适合于这种等待较多的任务。当一个线程等待 I/O 操作完成时,操作系统可以切换到另一个线程继续工作,从而更有效地利用 CPU。比如爬虫就是io密集

  • CPU 密集型任务:这些任务主要涉及大量的计算,CPU 持续处于忙碌状态。在这种情况下,使用多线程可能不会带来明显的性能提升,因为线程共享相同的 CPU 核心。相反,多进程可以在多核心处理器上并行执行,每个进程在不同的核心上运行,从而更有效地利用 CPU 资源。

  1. 线程ThreadPoolExecutor (concurrent.futures 模块):

    • 用途: 主要用于 I/O 密集型任务,如文件读写、网络请求等。
    • 工作原理: 使用线程池执行并发任务。由于 GIL(全局解释器锁(在 CPython 解释器中限制了同时只能有一个线程执行 Python 字节码))的存在,它不适合 CPU 密集型任务。(线程在执行 Python 代码时仍然是顺序执行。而多进程可以绕过 GIL 的限制,因为每个进程有自己的解释器和内存空间)
    • 优点: 线程切换开销小于进程切换,适用于多个较小的、阻塞式任务。
  2. 进程ProcessPoolExecutor (concurrent.futures 模块):

    • 用途: 适用于 CPU 密集型任务,如复杂计算、数据处理等。
    • 工作原理: 使用进程池执行并发任务,每个进程运行在其独立的内存空间内。
    • 优点: 避开 GIL 限制,可以充分利用多核 CPU。
  3. multiprocessing 模块:

    • 用途: 与 ProcessPoolExecutor 类似,用于 CPU 密集型任务。
    • 工作原理: 创建多个进程,每个进程都在自己的 Python 解释器内运行。
    • 特点: 提供了更丰富的进程间通信(IPC)工具,如管道、队列等。
  4. threading 模块:

    • 用途: 用于多线程编程,适合 I/O 密集型任务。
    • 特点: 相比于 ThreadPoolExecutor 提供了更底层的线程操作。
  5. asyncio 模块:

    • 用途: 用于编写单线程并发的异步 I/O 操作,适合高 I/O 等待的应用,如大量网络请求、高并发 Web 应用。
    • 特点: 通过事件循环和协程提供非阻塞操作。
  6. gunicorn + gevent:

    • 用途: 主要用于网络应用,特别是在 Python Web 框架中。
    • 工作原理: gevent 提供异步操作,而 gunicorn 作为一个 WSGI HTTP 服务器。
  7. Celery:

    • 用途: 用于异步任务队列/作业队列,特别适合需要执行长时间运行任务的应用。
    • 特点: 支持多种消息代理(如 RabbitMQ、Redis)作为任务队列。
  8. Dask:

    • 用途: 用于大规模数据处理,尤其是超出内存大小的数据集。
    • 特点: 提供并行数据处理,与 Pandas、NumPy、Scikit-Learn 等库良好集成。

http://www.lryc.cn/news/263680.html

相关文章:

  • 征文榜单 | 腾讯云向量数据库获奖名单公布
  • 如何预防[[MyFile@waifu.club]].wis [[backup@waifu.club]].wis勒索病毒感染您的计算机?
  • 中国风春节倒计时【实时倒计时】
  • 基于RBAC的k8s集群权限管控案例
  • 【华为数据之道学习笔记】5-11 算法模型设计
  • Flink系列之:SELECT WHERE clause
  • C#基础——委托、Action和Func的使用
  • 不止业务缓存,分布式系统中还有哪些缓存?
  • Java 基础学习(十三)集合框架、List集合
  • el-select二次封装实现可分页加载数据
  • css实现0.5px宽度/高度显——属性: transform: scale
  • html懒人加载实现
  • Axure情形动作篇(ERP登录效验)
  • LeetCode刷题--- 子集
  • 【SQL】根据年份,查询每个月的数据量
  • 基于CTF探讨Web漏洞的利用与防范
  • Apache CouchDB 垂直权限绕过漏洞 CVE-2017-12635 已亲自复现
  • 海康威视IP网络对讲广播系统命令执行漏洞(CVE-2023-6895)
  • IDE:DevEco Studio
  • 【QT】C++/Qt使用Qt自带工具windeployqt打包
  • Ubuntu系统的基础操作和使用
  • harmonyOS 自定义组件基础演示讲解
  • 我的创作纪念日——成为创作者第1024天
  • 正点原子驱动开发BUG(一)--SPI无法正常通信
  • SpringBoot接入轻量级分布式日志框架GrayLog
  • 光电器件:感知光与电的桥梁
  • Ceph入门到精通-smartctl 查看硬盘参数
  • Module build failed: TypeError: this.getOptions is not a function
  • 蓝牙电子价签芯片OM6626/OM628超低功耗替代NRF52832
  • ELK(八)—Metricbeat部署