学习

  • python多线程的缺点
    • 进程,线程和协程
    • 进程,协程的上下文切换
    • 线程和进程的实现方式

python多线程的缺点


python的多线程的问题:GIL导致PYTHON 无法使用到计算机的多核,仅能使用单核

JAVA传统的多线程主要解决的问题:
1、运行于多核CPU上,各线程可分布于CPU的各个核心,让程序真正的并发
2、因为外设(IO外设)的速度不匹配,导致线程阻塞。所以需要多线程切换来让阻塞的线程让出CPU,让其它线程运行。

python线程被人诟病的主要原因:
由于python设计之初,没预料到多核cpu能够得到现在的发展,只考虑到了单核cpu。为了更好的实现多线程之间数据完整性与状态同步,于是设计出了一个全局解析器锁(GIL, global interpreter lock)。
GIL确保Python进程一次运行一个线程(其它线程处于等待I/O或者睡眠状态),无论当前cpu有多少核心。这就意味着Python虽然可以实现多线程,但是在任意时间点仅有一个核心在执行Python指令(即线程无法并行运算),无法发挥现代多核cpu的性能。
CPython解析只允许拥有GIL才能运行程序。
理解GIL的弊端
write代表互斥锁,作用是防止多个线程一起修改某一共享数据data导致错误
1)Th1和Th2的下一步都要希望对data进行修改;
2) Th1在某一时刻同时拿到了GIL与write,准备对data进行修改;
3) Th1在准备修改前,发生了I/O请求,所以需要让出GIL(如果由于I/O请求让出GIL,该线程不参与GIL的竞争,如果由于持有时间到达上限,可参与竞争),但是write依旧才Th1手上;
4) Th2获得了GIL,但是由于缺少write也无法对data进行修改,达到持有GIL时间上限后,让出GIL,并参与竞争;
5) Th1的I/O完成后,参与GIL竞争(由于Th1持有write,所以无论Th2获得多少次GIL都无法对data进行修改,而持有GIL等待write的时间将会被浪费);
6) 直到Th1获得GIL后,由于Th1拥有GIL、write,所以对data进行修改,然后释放write,进行下一步操作,直到GIL持有时间达到上限或者进程结束,释放GIL(不持有GIL无法运行);
7) Th2获得Th1释放的write,等待GIL,获得后,修改data,直到GIL持有时间达到上限或者进程结束,释放GIL(不持有GIL无法运行);加粗样式

进程,线程和协程

进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。

线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。

协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。
协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。

进程,协程的上下文切换

cpu保存上一次的任务状态,加载下一个任务这个过程为一次上下文切换
协程
协程的切换其实就是cpu 寄存器内容特别是%rip 和 %rsp 的写入和恢复,因为cpu 的寄存器决定了程序从哪里执行(%rip) 和使用哪个地址作为堆栈 (%rsp)

现有协程库,是怎么去实现context切换的呢,目前主要有以下几种方式:
使用ucontext系列接口,例如:libtask
使用setjmp/longjmp接口,例如:libmill
使用boost.context,纯汇编实现,内部实现机制跟ucontext完全不同,效率非常高,后面会细讲,tbox最后也是基于此实现
使用windows的GetThreadContext/SetThreadContext接口
使用windows的CreateFiber/ConvertThreadToFiber/SwitchToFiber接口
线程
线程上下文切换的原因
  1.正常时间片完了之后的正常调度。
  2.执行任务时遇到IO阻塞,挂起当前线程加载下一个线程。
  3.多个任务抢占锁资源,当前任务没有抢到锁资源,被调度器挂起,继续下一任务。
  4.用户代码挂起当前任务,让出CPU时间。
  
  减少上下文切换
  1.无锁编程:
  2.CAS:原子类就是啦。
  3.协程:单线程里面实现调度多任务。

线程和进程的实现方式

线程
Java多线程实现的方式有四种
1.继承Thread类,重写run方法
2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target
3.通过Callable和FutureTask创建线程
4.通过线程池创建线程

前面两种可以归结为一类:无返回值,原因很简单,通过重写run方法,run方式的返回值是void,所以没有办法返回结果
后面两种可以归结成一类:有返回值,通过Callable接口,就要实现call方法,这个方法的返回值是Object,所以返回的结果可以放在Object对象中
进程的通信方式
1-1、无名管道(pipe);
 1-2、有名管道 (fifo);
 1-3、信号(signal);
 2-1、共享内存(share memory);
 2-2、消息队列(message queue);
 2-3、信号灯集(semaphore set);
以上6种进程间通信方式是用在本地一台计算机的不同进程间通信,而 Socket和Streams支持不同主机上的两个进程IPC, 即可用于本地一台计算机的不同进程间通信,但更多的是用于不同主机通过网络来通信。
3、套接字(socket)

python后端开发相关推荐

  1. 下列不属于python第三方库的是-python后端开发工程师考证试题

    原标题:python后端开发工程师考证试题 python开发工程师考证试题 选择题 题目 关于 Python 程序格式框架的描述,以下选项中错误的是 ( A ) A: Python 语言不采用严格的& ...

  2. python适合做后端开发吗-想从事Python 后端开发?

    先说思路,再说操作. 不管你用什么语言,PHP.Python 还是 Java,后端都会涉及到这些东西 1.计算机基础:操作系统.网络系统(协议).数据库系统.数据结构与算法 2.中间件:Nginx.M ...

  3. 专科python应届生工资多少-应届毕业生自述面试15K月薪的Python后端开发经历,希望对你有用...

    原标题:应届毕业生自述面试15K月薪的Python后端开发经历,希望对你有用 前言 马上就要到十二月,2018年也即将过去,众所周知每年的三四月份都是招聘高峰期,俗称:"金三银四" ...

  4. python后端开发技术论坛_python后端开发

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python软件开发,php软件开发,后端开发,运维自动化系统开发,堡垒机,云管 ...

  5. Python后端开发要求

    关于Python后端开发要求 一.对Python有兴趣,熟悉Python(标准库) 最好阅读过源码 了解Python的优化(熟悉pypy更佳) 二.至少至少一门语言(不说"精通") ...

  6. 如何成为自学成才的PYTHON后端开发人员?

    除非缺少路线图,否则自学成才的PYTHON开发者的路径上会充满挑战 软件开发本质上涉及两个部分:前端开发和后端开发,它们都有自己的挑战.但是,总的来说,后端开发被认为是专家'天堂,新鲜人害怕踩踏.后端 ...

  7. python后端开发学习重点

    python后端开发学习 最近在学习python后端开发,简单的总结了python后端开发所需的技术栈,希望对自学python的同学有一点帮助. 1.python语言基础 python的语法特点 py ...

  8. 自学 Python后端开发 到什么程度可以找工作

    前两天,在群里收到一个群友(强哥)跳槽成功的消息.真心为其感到高兴.为了找到一个更好的平台,为了拿到更理想的薪酬.他在面试前期做了相当多的准备(机会永远是留给有准备的人,这一点值得学习),写了很多关于 ...

  9. Python后端开发需要哪些知识

    Python后端开发需要掌握一些基础知识,包括: Python语言本身的基础知识,包括变量.数据类型.循环.分支.函数.模块等. 常用的第三方库,例如 NumPy.pandas.requests.Fl ...

  10. 我想找一份python后端开发工作,需要具备哪些技能。

    作为一名 Python 后端开发人员,您应该具备以下技能: 熟练掌握 Python 编程语言 理解 Web 开发技术,如 HTTP 协议.RESTful API 等 经验丰富的数据库编程,比如 MyS ...

最新文章

  1. 基于双门限法的端点检测
  2. Hadoop学习之第七章节:Hive安装配置
  3. win10 中的eclipse无法新建web项目
  4. itemchanged信号找不到_失物 | 求FDU同学帮转帮找蓝牙键盘,坐标东区宿舍19号楼...
  5. Django框架(14.Django中模型类的关系,以及模型类关联查询)
  6. 2017网易内推编程题(判断单词):解答代码
  7. 如何创建php文件,PHP如何生成.php程序文件
  8. 用python画渐变的圆_Python成像库(PIL)绘图 – 带渐变的圆角矩形
  9. 特斯拉FED在美售价上调至1.2万美元 国内售价6.4万元
  10. HDU2041 超级楼梯
  11. 计算机软件自学基础,计算机软件基础一高等教育自学考试试题与答案
  12. ballerina 学习二十六 项目docker 部署 运行(二)
  13. cJSON解析和打包
  14. SM2算法全套(基于GMSSL)
  15. 在linux上下载图片,在Linux上使用4k Stogram下载Instagram图片库 | MOS86
  16. ivitamin studio_151002 by vitamin studio
  17. Mininet系列实验(七):Mininet脚本实现控制交换机行为
  18. 上传文件的几种主要方法。
  19. android usb otg 查看,android USB OTG功能如何打开及实现
  20. 数字图像 - 图像隐写

热门文章

  1. 2023 安卓 iapp画质助手源码
  2. 23岁生日,写给自己
  3. tensorflow报错a Variable name or other graph key that is missin, Restoring from checkpoint failed. T
  4. Vue后台 - 利用 mockjs 完成数据的获取、编辑、增加、删除和分页【详细步骤篇】
  5. 使用SQL语句对表进行插入、修改和删除数据操作
  6. jQuery - 综合实例 - 下拉列表框打开指定网站
  7. 成功解决在from pyhdf.SD import SD,SDC时No module named ‘hdfext‘的问题
  8. 苹果电脑mysql_mac电脑mysql常用命令
  9. 【实战】1364- 实现一个完美的移动端瀑布流组件(附源码)
  10. 京津跨域通勤特征与职住空间分布研究