IO密集型: 推荐使用多线程
CPU密集型: 推荐使用多进程

为什么Python多线程在CPU密集型中是鸡肋?通过一段代码来测试

单线程执行从1亿递减到0

import datetimedef run(n):while n > 0:n -= 1if __name__ == '__main__':start_time = datetime.datetime.now()n = 100000000run(n)end_time = datetime.datetime.now()print('用时:', end_time - start_time)
用时: 0:00:03.044011

启用两个线程t1, t2各运行5000万次

import threading
import datetimedef run(n):while n > 0:n -= 1if __name__ == '__main__':start_time = datetime.datetime.now()n1 = 50000000n2 = 50000000threads = []t1 = threading.Thread(target=run, args=(n1,))threads.append(t1)t2 = threading.Thread(target=run, args=(n2,))threads.append(t2)for t in threads:t.start()for t in threads:t.join()end_time = datetime.datetime.now()print('用时:', end_time - start_time)
用时: 0:00:03.384256

耗时不减反增。
那么是什么导致Python多线程不快反慢呢?
原因就是GIL(Global Interpreter Lock)全局解释器锁, 来源是python设计之初的考虑,为了数据安全所做的决定。在Cpython(python主流解释器)中,解释器解释执行python代码时,先要取得这把GIL锁,正是这把锁保证在解释器中同时只有一个线程在运行。在python多线程中,python解释器按照以下方式运行:

1.设置GIL
2.切换到一个线程执行
3.执行
4.把线程设置为睡眠状态
5.解锁GIL
6.重复以上步骤

因为涉及到线程切换(保存线程上下文)、锁处理机制(设置锁,释放锁),导致多线程不快反慢。
但是在IO密集型程序中,多线程依旧能大幅度提升程序执行效率。例如socket server、爬虫等,因为大多数时候程序实在等待socket返回数据,当线程遇到I/O操作时会释放GIL,结果就是某个线程在等待结果时其他线程可以继续执行。计算密集型(CPU密集型)每运行100次也会释放GIL。

Python多线程多进程应用场景相关推荐

  1. python多线程多进程

    一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...

  2. python多线程 多进程

    多进程与多线程 我们都知道,操作系统中所有的程序都是以进程的方式来运行的,或者说我们把运行着的程序称为进程(Process).例如运行记事本程序就是启动一个记事本进程,运行两个记事本就是启动两个记事本 ...

  3. Python多线程多进程、异步、异常处理等高级用法

    文章目录 前言 多线程多进程 多线程 多进程 协程 总结 异步 基本概念 异步编程 asyncio aiohttp 异常 常见异常 异常处理 自定义异常 lambda表达式 lambda表达式用法 高 ...

  4. Python 多线程+多进程简单使用教程,如何在多进程开多线程

    一.Python多进程多线程 关于python多进程多线程的相关基础知识,在我之前的博客有写过,并且就关于python多线程的GIL锁问题,也在我的一篇博客中有相关的解释. 为什么python多线程在 ...

  5. Python 多线程 多进程 协程 yield

    python中多线程和多进程的最大区别是稳定性和效率问题 多进程互相之间不影响,一个崩溃了不影响其他进程,稳定性高 多线程因为都在同一进程里,一个线程崩溃了整个进程都完蛋 多进程对系统资源开销大,多线 ...

  6. python 多线程多进程logging系统写入同一日志文件处理方法

    多线程进程,logging写入日志到同一文件的处理方法 python logging系统切分问题 TimedRotatingFileHandler切分逻辑源码 解决方案 python logging系 ...

  7. python多线程多进程多协程_python 多进程、多线程、协程

    1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...

  8. python学习笔记(十六)-Python多线程多进程

    一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...

  9. python 多线程 多进程 zmq_研二硕, Python +pyqt,多进程问题求助

    51 60 天前 @knightdf import sys from PyQt5.QtWidgets import QMainWindow,QApplication,QWidget from unti ...

最新文章

  1. Sharepoint 2010 页面设计确实方便
  2. A标签的href设置为#代表什么意思?
  3. 中怎么均化走线_PCB板上多长的走线才是传输线?答案是……
  4. ichat在线客服jQuery插件(可能是历史上最灵活的)
  5. 网站颜色变黑白的CSS代码,Chrome、火狐、IE
  6. 向一个数组中插入元素
  7. 小数的初步认识ppt_三年级数学知识点总结-10小数的初步认识
  8. linux 系统信号忽略和system函数返回值问题(system的实现)
  9. numpy广播机制小结
  10. 【网页模板】Bootstrap免费模板
  11. [奶奶看了都会]京东自动签到薅羊毛-完整教程
  12. java如何删除文件夹_Java如何删除文件夹和子文件夹
  13. html5 如何打包成apk,将H5封装成android应用APK文件的几种方法
  14. 从分类到选型,一文了解 SITOP 电源
  15. 快速学会CAD绘制传输线路图纸
  16. 惩罚函数法例题matlab,外点惩罚函数法例题
  17. html布局flex有什么优势,css flex布局的优缺点是什么
  18. Android下的linux指令集
  19. [趣味][人工智能生成文字]chatGPT使用教程
  20. [附源码]java毕业设计教务系统

热门文章

  1. 二级指针(指向指针的指针)
  2. MySql底层索引原理
  3. 基于关键词的文本生成----思路和思考
  4. Github搜索开源项目过滤技巧
  5. 雷达成像原理(一)合成孔径成像Chirp-Scaling
  6. 网站本地化翻译、建设助力企业拓展全球市场 安睿杰翻译
  7. linux系统vi替换命令,linux:vi 替换命令
  8. Disentangled Graph Collaborative Filtering
  9. C指针与指针之间的相减操作
  10. Selenium2学习(四)-- xpath定位