Python中的多线程深入解析

进程

操作系统如何管理计算机的应用程序来分配资源的?
  • 进程:进程是竞争计算机资源的基本单位。每一个应用程序至少有一个进程
    单核CPU,永远只能够执行一个应用程序?
  • 在不同的应用程序之间切换
  • 同时pycharm,风暴英雄,QQ
    进程调度
  • 算法决定每个应用程序的挂起,或者是切换到另外一个进程
  • 操作系统原理中有详细讲解
  • 进程、线程相互切换的开销是非常大的,原因就是需要上下文需要保存,上下文频繁的保存加载所以需要的开销就是比较大的。

线程

线程和进程有什么区别?
  • 线程是进程的一部分,一个进程可以有一个线程,也可以有多个线程
  • 从资源的角度来看,进程管理CPU资源的话,粒度太大了,需要更小的单元来管理CPU的资源,需要一个更加灵活的小巧的机制来协调CPU资源的利用,这个就是线程,线程之间的切换资源消耗小很多
  • 线程和进程之间的分工不同,进程主要是用来分配资源(内存资源),而线程是用来利用CPU来执行代码的,线程本身不能够分配和拥有资源,但是线程可以访问资源
  • 线程是属于进程的,可以访问进程中的资源,这也是线程切换快速的一个原因

多线程

  • 想要代码运行的有效率,那么多线程是有必要的
  • 当我们写了代码的时候,不管代码多么的简单,都会有一个默认的线程来执行这个代码,这个默认的线程通常是主线程
import threading

print('i am qiyue’)
t = threading.current_thread()
print(t.getName())
# 主线程

执行结果:

i am qiyue
MainThread
  • 大多数情况下代码都是在主线程中执行的,但是其实我们还可以在主线程中启动其他的线程
# -*- coding: utf-8 -*-
import threading
def worker():
    print('i am thread')
    t = threading.current_thread()
    print(t.getName())
t = threading.current_thread()
print(t.getName())
new_t = threading.Thread(target=worker, name='qiyue-thread')
new_t.start()

执行结果:

MainThread
i am thread
qiyue-thread
  • 我们启动的线程是可以自定义名字的,还有一点值得注意,单线程是顺序执行的,但是一旦我们在主线程中启动了新的线程,那么这个线程的执行已经和主线程没有关系了。
多线程有什么优势和好处呢?
  • 充分的利用CPU的性能优势,从而加快代码的执行速度
  • 多线程的编程其实也是异步编程的一种形态
  • 还记得之前提到的一个特性吗?对于单核的CPU,同一时刻,只允许一个线程来执行代码,那么多线程的意义在什么地方呢,理论上是这样的,但是对于多核的CPU,比如4核的CPU,让A核处理主线程,其他的核处理新开的线程,多核的CPU完全是,有能力让不同的核去处理不同的线程,这个时候其实就是在并行的处理程序,其实这个就是多线程的意义。说到这个地方,我们看似都非常的美好,多核的CPU有非常的强大,但是,很遗憾的额告诉大家,我们的python是没有办法充分利用多核CPU优势的。
  • 一些有基础的同学可能听说过这么一句话,Python的多线程是鸡肋,那么这句话到底对不对呢?这就取决于你如何定义这个鸡肋了,在三国演义中,说所谓的鸡肋,食之无味,弃之可惜,当然,python的多线程还是有一定的意义的,如果没什么用,那还存在干啥呢,是吧。
  • 先来说一下为啥Python不能使用多核CPU,主要是因为,Python中存在一个GIL,全局解释器锁,在内存资源中,一个进程可以有多个线程,线程之间共享资源,这就有可能多个线程访问同一个资源,这就造成了线程有可能是不安全的,为了保证线程安全就出现了锁,一旦我们对某一个对象加锁之后,不管有多少个线程,只有拿到锁的线程才能对相关的变量进行操作。
  • 锁可以分为两类,一类是细粒度的锁,也就是程序员主动加的锁,一类是粗粒度的锁,解释器加的锁,比如,GIL,在python的解释器上,同一时刻只能有一个线程来执行,所以即使是多核的CPU也无能为力,在一定程度上保证了线程安全,比如有代码a+=1,这段代码到Python的解释器中会被翻译成bytecode,Python解释器会执行bytecode,这行代码可能被翻译成多段的bytecode,如果解释器正在执行这多段中的一段的时候,线程就被挂起了,然后切换到另外的线程执行,这个线程执行完,回来继续执行剩下的bytecode的时候,就不会保证该线程是安全的了,如果说a+=1这多段bytecode会一直执行完,不会被中断,那么就可以保证线程安全了。
  • Python其实只是语言的规范,关键起作用的是语言解释器,我们最常见的有cpython,jpython,GIL是在cpython中的,在jpyhton中是没有GIL的。
  • Python的多线程到底是不是鸡肋,每个语言都有它的优势同时也有它的缺点,比如,nodejs就是单进程单线程的,对于CPU密集型的程序,多线程的意义确实不大,但是对于我们来说,大多数情况下编写的都是IO密集型的程序,IO密集型的程序,查询数据库,请求网络资源,读写文件都属于IO操作,执行一段代码的时候,绝大多数时间都花在io操作上的程序,为io密集型程序,按照时间段消耗来划分。Python的多线程对于IO密集型程序是有一定的意义的,把线程等待的时间,换到别的线程使用CPU,这就是多线程在IO密集型程序中的优势。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容