Python多线程详解

python中的多线程是一个非常重要的知识点,但python 默认是单任务,所以今天简单的介绍一下多线程。

什么是线程:

  • 线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。
  • 线程是进程中的一个实体,是CPU调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。
  • 一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行

主线程:当⼀个程序启动时,就有⼀个进程被操作系统(OS)创建,与此同时⼀个线程也⽴刻运 ⾏,该线程通常叫做程序的主线程

主线程的重要性:

  • 是产生其他子线程的线程
  • 通常它必须最后完成执行各种关闭动作

子线程:可以看做是程序执⾏的⼀条分⽀,当⼦线程启动后会和主线程⼀起同时执⾏

使用threading .Thread(target=函数名,args=(参数列表,元组))创建子线程对象

那究竟什么是多线程呢,通过下面的例子很容易就搞懂了。

假如你要烧水和拖地还有玩游戏,一共三个任务,如果是单线程来处理这三个任务的话,先烧水,等水烧开,再拖地,然后才能玩游戏。这样等待水烧开的时间就白白浪费了,倘若事交给多线程来做的话,就先烧水,烧水的过程中(相当于IO操作的时候)把时间资源让出来给拖地和玩游戏,当拖完地且玩完游戏后水也烧好了,这个就是多线程的优势。

我们分别来看一下单线程和多线程的实现:

单线程:

import time

def mop_floor():
    print('我要拖地了')
    time.sleep(1)
    print('地拖完了')

def game():
    print('我要玩游戏')
    time.sleep(4)
    print('游戏结束了')

def heat_up_watrt():
    print('我要烧水了')
    time.sleep(6)
    print('水烧开了')

start_time = time.time()
heat_up_watrt()
mop_floor()
game()
end_time = time.time()
print('总共耗时:{}'.format(end_time-start_time)) 

结果如下:
单线程

多线程:

import threading
import time

def mop_floor():
    print('我要拖地了')
    time.sleep(1)
    print('地拖完了')

def game():
    print('我要玩游戏')
    time.sleep(4)
    print('游戏结束了')

def heat_up_watrt():
    print('我要烧水了')
    time.sleep(6)
    print('水烧开了')

start_time = time.time()
t1 = threading.Thread(target=heat_up_watrt)
t2 = threading.Thread(target=mop_floor)
t3 = threading.Thread(target=game)

t1.start()
t2.start()
t3.start()

t1.join()
t2.join()
t3.join()

end_time = time.time()
print('总共耗时:{}'.format(end_time-start_time)) 

结果如下:
多线程
可以看到烧水等待的时候直接执行拖地任务,并且总共耗时为6秒,比上面的单线程节省了近一半的时间。

关于这里的start和jion都是固定的操作套路,记住这两个代词以后直接套用即可,需要注意的是多线程程序的执行顺序是不确定的。当执行到sleep语句时,线程将被阻塞(Blocked),到sleep结束后,线程进入就绪(Runnable)状态,等待调度的命令执行另一个子线程,线程调度将自行选择一个线程执行。

如有错误,欢迎私信纠正,谢谢支持!

posted @ 2022-11-16 18:06  杨业壮  阅读(2396)  评论(1编辑  收藏  举报