其他分享
首页 > 其他分享> > 3.多线程.md

3.多线程.md

作者:互联网

多线程

进程与线程

多线程---并发

Threading模块

多线程基础

import time

def doing(something):
    time.sleep(2)
    print('正在做>>>',something)
start_time =time.time()
doing('在上课')
doing('在上班')
end_time =time.time()
print('总共耗时>>>',end_time-start_time)

控制台输出:
正在做>>> 在上课
正在做>>> 在上班
总共耗时>>> 4.010261297225952

io密集型

#-------------------------------------------------------------
"""
    需求:执行效率低
    优化:使用多线程
    io密集型
"""
#-------------------------------------------------------------
def doing(something):
    print('正在做>>>', something)
    time.sleep(2)

start_time = time.time()

#1-创建线程
"""
    target:函数名
    args:函数名对应的实参,元组形式
"""
t1=threading.Thread(target=doing,args=('在上课',))
t2=threading.Thread(target=doing,args=('在加班',))

#2-启动线程
t1.start()
t2.start()
end_time = time.time()
print('总共耗时>>>', end_time - start_time)

控制台输出
正在做>>> 在上课
正在做>>> 在加班总共耗时>>>
 0.0009598731994628906

分析发现跟预期结果不一致,预期结果是大概是2s,现在是0s
原因:直接启动线程:主线程(main)不等待子线程(t1/t2)完成就结束

优化方案:

3-阻塞主线程

t1.join()
t2.join() 

控制台输出
正在做>>> 在上课
正在做>>> 在加班
总共耗时>>> 2.0047731399536133

计算密集型

#-------------------------------------------------------------
"""
    需求:执行效率低
    优化:使用多线程
    计算密集型
"""
#-------------------------------------------------------------
def doing():
    dataNum=0
    for i in range(10000000):
        dataNum+=1

start_time = time.time()

#1-创建线程
"""
    target:你这个线程是做什么,需要执行的函数名
    args:函数名对应的实参,元组形式
    直接启动线程:主线程(main)不等待子线程(t1/t2)完成就结束
    需求:主线程退出之前需要等待子线程全部执行完
    优化:阻塞主线程 
    串行:总共耗时>>> 1.0268769264221191
"""
#t1=threading.Thread(target=doing,args=('在上课',))
#t2=threading.Thread(target=doing,args=('在加班',))
#
##2-启动线程
#t1.start()
#t2.start()
##3-阻塞主线程
#t1.join()
#t2.join()
doing()
doing()
end_time = time.time()
print('总共耗时>>>', end_time - start_time)

控制台输出:
总共耗时>>> 1.0268769264221191

多线程方式;
改变部分的代码

t1=threading.Thread(target=doing)
t2=threading.Thread(target=doing)

#2-启动线程
t1.start()
t2.start()
#3-阻塞主线程
t1.join()
t2.join()

控制台输出
总共耗时>>> 1.0593979358673096

通过对比发现对应计算密集型来说,使用串行和多线程,耗时一样
对于cpython解释器GIL(全局解释器锁)),不管多少核 cpu同一时间只能处理一件事

原因:
多线程是并发:并发是来回切换执行不同的任务,导致计算密集型执行的时间比串行还长,因为来回切换也需要耗时

守护线程:

#-------------------------------------------------------------
"""
    需求:执行效率低
    优化:使用多线程
    守护线程
    主线程想满足一个条件就退出,使用多线程直接不能直接退出主线程
"""
#-------------------------------------------------------------
def doing():
    while True:
        print('我在doing')
        time.sleep(1)

start_time = time.time()

#1-创建线程
"""
    target:你这个线程是做什么,需要执行的函数名
    args:函数名对应的实参,元组形式
    直接启动线程:主线程(main)不等待子线程(t1/t2)完成就结束
    需求:主线程退出之前需要等待子线程全部执行完
    优化:阻塞主线程 
    串行:总共耗时>>> 1.0268769264221191
"""
t1=threading.Thread(target=doing)
t2=threading.Thread(target=doing)

#2-启动线程
t1.start()
t2.start()
#3-阻塞主线程
#t1.join()
#t2.join()
end_time = time.time()
for i in range(3):
    print('**********主线程正在执行*******')
print('**********主线程结束*******')
print('总共耗时>>>', end_time - start_time)


控制台输出:
死循环
我在doing
我在doing**********主线程正在执行*******

**********主线程正在执行*******
**********主线程正在执行*******
**********主线程结束*******
总共耗时>>> 0.0009987354278564453
我在doing我在doing

我在doing我在doing

我在doing我在doing

我在doing我在doing

我在doing我在doing

分析:
主线程一直无法退出
优化:
增加守护线程 setdaemon(True)
在以下位置增加守护部分代码

t1=threading.Thread(target=doing)
t2=threading.Thread(target=doing)

t1.setDaemon(True)#守护
t2.setDaemon(True)

#2-启动线程
t1.start()
t2.start()

控制台输出
我在doing
我在doing
**********主线程正在执行*******
**********主线程正在执行*******
**********主线程正在执行*******
**********主线程结束*******
总共耗时>>> 0.0009744167327880859

标签:md,doing,t2,t1,start,线程,time,多线程
来源: https://www.cnblogs.com/xiehuangzhijia/p/14983991.html