1、多线程-1
1.1、引入多任务
就是可以同时运行多个任务,比如一边上网,一边听歌,一边使用word写文章等,这就是多任务。
from time import sleep
def sing():
for i in range(3):
print("正在唱歌...%d" % i)
sleep(1)
def dance():
for i in range(3):
print("正在跳舞...%d" % i)
sleep(1)
if __name__ == "__main__":
sing() # 唱歌
dance() # 跳舞
运行结果就为:
正在唱歌...0
正在唱歌...1
正在唱歌...2
正在跳舞...0
正在跳舞...1
正在跳舞...2
所以这就不是多任务并发进行,要对代码进行修改,则修改为如下:
from time import sleep
import threading
def sing():
for i in range(3):
print("正在唱歌...%d" % i)
sleep(1)
def dance():
for i in range(3):
print("正在跳舞...%d" % i)
sleep(1)
if __name__ == "__main__":
t1 = threading.Thread(target = sing)
t2 = threading.Thread(target = dance)
t1.start()
t2.start()
运行结果为:
正在唱歌...0
正在跳舞...0
正在跳舞...1
正在唱歌...1
正在唱歌...2
正在跳舞...2
这便是多任务进行运行。
1.2、什么是多任务
1.2.1、多任务
- 同时可以进行多个任务,比如在电脑上同时进行多个任务,比如电脑边听歌边用word,如果在一个操作系统上同时运行了多个程序,那么称这个操作系统是多任务的操作系统,Windows、Ubuntu、mac、Andriod、ios
- 如果一个程序,可以同时执行多个事情,那么就称为多任务程序。
1.2.2、多任务执行的原理
- 一个cpu是单核,默认可以执行一个程序,如果想要执行多个程序一起执行,理论上就需要多个cpu来执行。
- 单核cpu是怎么执行多任务的呢?真相只有一个--那就是:如果一个cpu是4核,理论上将同时只有4个任务能一起执行,但是事实上却可以运行很多个程序,之所以有这个现象,是因为操作系统控制着cpu,让cpu做了一个特殊的事情,一会运行一个程序,然后快速的运行另外一个程序,再运行另外的程序,以此类推,实现了多个任务看起来再“一起”运行。
- 操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行到0.01秒,再切换到任务3,执行0.01秒,这样反复执行下去,表面上看,每个任务都是交替执行的,但是,由于cpu的执行速度实在是太快了,我们就感觉像是所有任务都在同时执行。操作系统为了让多个程序都能够得到的执行的机会,采用了一系列的方案来实现,例如:时间片的调度。 --所以这是假的多任务。但是多核cpu才是真正多任务,但是一般达不到真正的条件,一般都是假的。cpu的核心数少于你所要执行你的任务数,便是假的。
1.2.3、并发、并行
- 并发:是一个对假的多任务的描述
- 并行:是对一个真的多任务的描述
- python中实现多任务有两种方式,一个是线程,一个是进程。
1.3、线程
简单理解为程序在执行代码时的那个执行流。
1.4、通过线程理解多任务
- 当一个程序运行时,默认有一个线程,这个线程我们称之为主线程。
- 多任务:也就可以理解为让你的代码在运行过程中额外创建一些线程,让这些线程去执行代码。
- 在python中想要通过线程去实现多任务,可以使用很底层的thread模块,那么意味着过程可能较为复杂不方便,使用threading模块可以更加方便使用。
1.5、使用threading模块
1.5.1、单线程执行时
import time
def say_sorry():
print("我错了")
time.sleep(1)
for i in range(5):
say_sorry()
运行结果:
我错了
我错了
我错了
我错了
我错了
1.5.2、多线程执行时
import threading # 一个模块
import time
def say_sorry():
print("我错了")
time.sleep(1)
for i in range(5):
t = threading.Thread(target = say_sorry) # Thread是一个类,创建出来的对象找了一个t作为变量,创建出来的对象是一个新的线程,但是他并不会立刻执行
# 括号里面的等于是传参数,关键字参数
t.start() # 启动线程,即让线程开始执行。
!!!创建了一个对象,在开始执行
使用threading模块
# 1. 导入threading模块
import threading
import time
def task_1():
while True:
print("11111")
time.sleep(1)
# 2.使用threading模块中的Thread创建一个对象
t1 = threading.Thread(target = task_1)
# 3.调用这个实例对象的start方法让这个线程开始运行
t1.start()
while True:
print("222222")
time.sleep(1)
运行结果
11111
222222
11111
222222
11111
222222
11111
222222
11111
222222
11111
222222
11111
222222
11111
222222
222222
小结:!
- 想要执行一个单独的任务,那么就需要创建一个新的线程。
- 在python中使用threading模块中的Thread类,就可以创建一个对象,这个对象标记着线程,创建出来的线程默认是不会执行的。
- 调用这个线程对象的start方法,就可以让这个新的线程开始执行代码,至于这个线程去执行哪里的代码,要开在用Thread创建对象的时候给target参数传递的是哪个函数的引用,即将来线程就会执行target参数指明的那个函数。
- 如果想在一个程序中有多个任务一起运行,那么就创建多个Thread对象即可。