1、使用多线程可以有效利用CPU资源,线程享有相同的地址空间和内存,这些线程如果同时读写变量,导致互相干扰,就会产生并发问题,为了避免并发问题,绝不能让多个线程读取或写入相同的变量,因此python中使用了全局锁(GIL),此锁只有一个,当某线程执行某个函数时,其他线程不能同时执行,直到锁被释放(同时也要小心死锁的情况),因此无论有多少个线程,同一时刻只有一个线程持有该锁,也就是只能以单线程模式执行,因此代码并不能在同时在多核上并发,多线程在python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到一核。
2、GIL是Python解释器设计的历史遗留问题,通常我们用的解释器是官方实现的CPython,要真正利用多核,除非重写一个不带GIL的解释器。所以,在Python中,可以使用多线程,但不要指望能有效利用多核。如果一定要通过多线程利用多核,那只能通过C扩展来实现,不过这样就失去了Python简单易用的特点。
3、不过,Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务,并实现真正意义上的并发。多个Python进程有各自独立的GIL锁,互不影响。但是,进程的开销比线程大,如果有较多并发进程的话,不建议。
4、由于线程享有相同的地址空间和内存,所以线程间通信非常容易,进程间通信复杂,常见进程间通信有:管道(Pipes)、消息队列(Queue)、socket接口(TCP/IP)(麻烦)等,python的mutilprocess模块提供了封装好的管道和队列,可以方便的在进程间通信,python进程间的同步使用锁,这点和线程一样。
5、计算密集型:不适合用多线程,因为要进行大量的计算,消耗CPU资源,虽然可以用多任务,但任务越多,花在任务切换的时间越多,CPU执行任务的效率越低,因此,代码运行效率至关重要。Python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用C语言编写;
IO密集型:CPU消耗很少,大部分时间都在等待IO操作完成,执行任务期间,99%花在IO上,因此,对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差,可以使用多线程,或者伪线程。
异步IO:考虑到CPU和IO之间巨大的速度差异,一个任务在执行的过程中大部分时间都在等待IO操作,单进程单线程模型会导致别的任务无法并行执行,因此,我们才需要多进程模型或者多线程模型来支持多任务并发执行。
现代操作系统对IO操作已经做了巨大的改进,最大的特点就是支持异步IO。如果充分利用操作系统提供的异步IO支持,就可以用单进程单线程模型来执行多任务,这种全新的模型称为事件驱动模型,Nginx就是支持异步IO的Web服务器,它在单核CPU上采用单进程模型就可以高效地支持多任务。在多核CPU上,可以运行多个进程(数量与CPU核心数相同),充分利用多核CPU。由于系统总的进程数量十分有限,因此操作系统调度非常高效。用异步IO编程模型来实现多任务是一个主要的趋势。
对应到Python语言,单线程的异步编程模型称为协程,有了协程的支持,就可以基于事件驱动编写高效的多任务程序。
6、进程由若干线程组成,一个进程至少有一个线程。
7、python标准库提供了两个模块:thread和threading。thread是低级模块,以Function作为线程的运行体;threading是高级模块,基于对象,可以继承Thread对象来实现线程,通常只需使用threading这个高级模块。
8、进程 vs. 线程
多进程模式最大的优点就是稳定性高,因为一个子进程崩溃了,不会影响主进程和其他子进程。(当然主进程挂了所有进程就全挂了,但是Master进程只负责分配任务,挂掉的概率低)著名的Apache最早就是采用多进程模式。
多进程模式的缺点是创建进程的代价大,在Unix/Linux系统下,用fork调用还行,在Windows下创建进程开销巨大。另外,操作系统能同时运行的进程数也是有限的,在内存和CPU的限制下,如果有几千个进程同时运行,操作系统连调度都会成问题。
多线程模式通常比多进程快一点,但是也快不到哪去,而且,多线程模式致命的缺点就是任何一个线程挂掉都可能直接造成整个进程崩溃,因为所有线程共享进程的内存。在Windows上,如果一个线程执行的代码出了问题,你经常可以看到这样的提示:“该程序执行了非法操作,即将关闭”,其实往往是某个线程出了问题,但是操作系统会强制结束整个进程。

转载于:https://www.cnblogs.com/chaofan-/p/8615724.html

python中的多进程与多线程(二)相关推荐

  1. python多线程好还是多协程好_深入浅析python中的多进程、多线程、协程

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...

  2. python廖雪峰_【Python】python中实现多进程与多线程

    进程与线程 进程(process)就是任务,是计算机系统进行资源分配和调度的基本单位[1].比如,打开一个word文件就是启动了一个word进程. 线程(thread)是进程内的子任务.比如word中 ...

  3. async python两个_【Python】python中实现多进程与多线程

    进程与线程 进程(process)就是任务,是计算机系统进行资源分配和调度的基本单位[1].比如,打开一个word文件就是启动了一个word进程. 线程(thread)是进程内的子任务.比如word中 ...

  4. 你所谓的鸡肋?Python中的多进程、多线程和协程

    本文撰写过程中参考了胡俊峰老师<Python程序设计与数据科学导论>课程的内容. 概念: 并发:一段时间内同时推进多个任务,但不一定要在一个时刻同时进行多个任务. 并行:一段时间内同时推进 ...

  5. python中的多进程与多线程(一)

    进程是一个执行中的程序,每个进程有自己的地址空间.内存.数据栈以及其他用于跟踪执行的辅助数据.操作系统管理其上所有进程,并合理分配时间. 进程也可以通过fork或spawn派生新的进程,每个新进程有自 ...

  6. Python 中的多进程(进程之间的通信)

    文章目录 在进程之间共享数据 共享内存 服务器进程 进程之间的通信 队列 管道 这篇文章将会讲解在 Python 中使用 多进程模块时在进程之间共享数据和消息传递的概念. 在多处理中,任何新创建的进程 ...

  7. Python中的多进程并行简明教程

    1. 什么是多进程并行 一般来说,多进程意味着并行运行两个或者多个任务.在Python中我们可以使用python内置的multiprocessing模块来实现这一功能. 我们来举个栗子,假设我们需要运 ...

  8. python中的协程(二)

    协程 1.协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切,整个线程都阻塞在原地,该线程内的其他 ...

  9. python中正则表达以及多线程,建立服务器端

    多重继承 我们先来看一下代码: class Father(object):def __init__(self, name):self._name = namedef drink(self):print ...

最新文章

  1. [Job Interview] C/C plus plus Programming
  2. 明天参加SmartClient讲座苏州站的来报个名,认识认识。
  3. windows 安装cython-bbox
  4. Vue 模板语法 插值操作 绑定属性 计算属性 事件监听 条件判断 循环遍历 阶段案例
  5. NTU 课程: MAS714(3) DFS BFS(搜索算法)
  6. mysql+永久+关闭提交,MySQL学习【第十一篇存储引擎之事务解释】
  7. nanflash编程的地址问题
  8. ADSL断流问题分析
  9. [蓝桥杯2018决赛]阅兵方阵-模拟,枚举
  10. 混合背包(信息学奥数一本通-T1270)
  11. 面试项目亮点_程序员面试时这样介绍自己的项目经验,等于成功了一大半
  12. 创造自己的专属免费网盘:Nextcloud
  13. (转)汉字转拼音码缩写
  14. scala读写linux上的文件,一起学Scala 文件 I/O
  15. xcode 9.0 iOS 11
  16. 渲梦工厂V2.1.5.0简体中文官方版,作图快10倍~
  17. python灰色关联度分析_基于灰色关联度重庆万州区边坡稳定影响因素分析
  18. 超详细超快的免费图床设置教程
  19. 苹果8的爆料这么多?为什么...
  20. 【matlab】 动态绘制三维心形图

热门文章

  1. SFTP例子2----使用JSch实现SFTP文件传输
  2. 记一次php手工注入(mysql)
  3. windows server 2008 r2之间的ftp传输脚本
  4. SQL Server 2008 正式版安装指南(附序列号)
  5. Everyday English: Socialising (formal) 吃formal用语
  6. 人,最终可能还是平静的干事情,这是最终的奥义
  7. Resources与StreamingAssets文件夹的区别
  8. 金蝶CLOUD星空云tempdb过大处理方法
  9. 【机器学习】--回归问题的数值优化
  10. Django - app