多线程的使用

到目前为止,前面的章节文章都是单线程运行。就像一个人工作,必须一件事结束,再开始另一件事情,这就是所谓的单线程

多线程就是雇佣多个人,一起做同一件事或者将不同的事分给不同的人去做,可以大幅度的提交效率

先来看下多线程需要的库:Python内置的线程库threading

线程的运行,通过threading,初始化得到一个实例,然后给他一个可以执行的函数,让他执行就不用管了,就像你在电脑上把音乐软件打开,然后隐藏到后台,它还是会继续工作,然后你继续做你的事情是一样的意思。

能开一个线程,就能开多个线程.....

在代码中初始化一个线程,并给他函数让他执行,他跑到后台去执行了,然后代码可以继续往下工作,先上一段代码理解下:

import threading, time

def loop():
    print("loop start run")
    time.sleep(5)
    print("loop exit")

t = threading.Thread(target=loop, name="LoopThread")
t.start()
print("代码运行结束")

解释一下代码:

  • 首先导入两个库,一个是线程threading,另一个是time库【主要是sleep函数】
  • 然后在代码中,定义了loop函数,执行操作有打印loop start run,接着睡眠5秒钟,接着打印loop exit
  • 再是初始化一个线程,目标函数是loop,给线程赋一个名字LoopThread
  • 启动线程,然后不管了,脚本代码打印代码运行结束之后退出

先来看结果图:

python多线程

从结果图来看,整体运行了5秒,但是代码运行结束loop exit的前面,也就是说线程的运行情况和当前代码执行顺序无关,它只管运行它的。

就像是我有个任务——执行loop函数,我嫌函数无聊不想执行,我就找一个人来把我这个任务拿去执行,然后我做我的事。

理论上两个时间是重合的,时间会剪短,但是这里是看不出来的,因为代码执行的太快,时间和5秒相比毫无意义。

接下来定义两个,来测试一下时间问题:

import threading, time

def loop():
    print("loop start run")
    time.sleep(5)
    print("loop exit")

t1 = threading.Thread(target=loop, name="LoopThread-1")
t2 = threading.Thread(target=loop, name="LoopThread-2")
t1.start()
t2.start()
time.sleep(3)
print("代码运行结束")

这个示例是基于上一个示例的,现在创建两个线程,都在运行,理论上睡眠时间是5+5+3=13秒的,来看下具体执行情况:

thread多线程加时

还是短短的5.1秒,远小于13秒。

简单说下为什么:t1睡眠5秒的时间和t2睡眠5秒是重合的,还有代码睡眠3秒是在5秒的时间范围内的,所以最后的运行时间也就是程序开始,到程序全部结束的时间。

明白了线程的运行,然后继续了解下线程的其他知识点

知识点一:父线程和子线程

父线程和子线程是相对的。就拿刚才的示例来讲,代码执行是单线程,代码中创建了t1和t2,对于代码的单线程来讲,t1和t2是它的子线程,因为他们是被代码的单线程创建出来的。

知识点二:守护线程

守护线程和普通线程基本没什么区别,但是有一点特殊,即守护线程还没执行完,主线程退出,守护线程会强制退出;但是主线程执行结束,普通线程没结束,主线程会等待普通线程结束再退出

上一个示例代码和运行结果图:

import threading, time

def loop():
    print("loop start run")
    time.sleep(5)
    print("loop exit")
t = threading.Thread(target=loop, name="LoopThread")
t.setDaemon(True)
t.start()
print("代码运行结束")
Python守护线程

子线程还没结束,主线程已经结束了,强制退出,运行时间仅0.2秒。

对比本文第一个示例【非守护线程】,总执行时间有5.1秒呢

知识点三:线程和进程

线程:线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。一个线程是一个execution context(执行上下文),即一个cpu执行时所需要的一串指令。

进程:一个程序的执行实例就是一个进程。每一个进程提供执行程序所需的所有资源。(进程本质上是资源的集合)

一个进程有一个虚拟的地址空间、可执行的代码、操作系统的接口、安全的上下文(记录启动该进程的用户和权限等等)、唯一的进程ID、环境变量、优先级类、最小和最大的工作空间(内存空间),还要有至少一个线程。

知识点四:Python的线程是鸡肋?

用C、C++来写死循环,直接可以把全部核心跑满,4核就跑到400%,8核就跑到800%,但是Python是不行的。

因为Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。

Python3更多教程——传送门

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容

  • 进程和线程 进程:正在运行的程序线程:基本执行单元一个进程至少要一个线程一个进程的所有任务都是在线程中执行一个线程...
    mian小爬阅读 241评论 0 0
  • 线程 引言&动机 考虑一下这个场景,我们有10000条数据需要处理,处理每条数据需要花费1秒,但读取数据只需要0....
    不浪漫的浪漫_ea03阅读 362评论 0 0
  • 引言&动机 考虑一下这个场景,我们有10000条数据需要处理,处理每条数据需要花费1秒,但读取数据只需要0.1秒,...
    chen_000阅读 510评论 0 0
  • iOS中,只有主线程跟Cocoa关联,也即是在这个线程中,更新UI总是有效的,如果在其他线程中更新UI有时候会成功...
    mengyingguo阅读 520评论 0 0
  • 晴朗的午后 微醺的阳光 空气热的人昏昏欲睡 刚好 穿堂风路过 一切又都那么惬意
    功不唐捐阅读 147评论 0 0