1.多任务的概念
多任务: 在同一时间内执行多个任务,每个任务可以理解成现实生活中干的每个活。
操作系统可以同时运行多个任务。打个比方,你一边在使用浏览器上网,一边在使用网易云音乐听歌,一边在使用Word赶作业,这就是多任务。
操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。
单核cpu是并发的执行多任务,真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。
2.并发:
指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)
3.并行:
指的是任务数小于等于cpu核数,即任务真的是一起执行的
4.线程
#线程:可以理解成执行代码的分支,线程是执行程序中的代码的
import threading
import time
def sing():
for i in range(3):
print("唱歌中")
time.sleep(0.2)
def dance():
for i in range(3):
print("跳舞中")
time.sleep(0.2)
if __name__ == '__main__':
dance_thread = threading.Thread(target=dance)
sing_thread= threading.Thread(target=sing)
dance_thread.start()
sing_thread.start()
导入线程模块
#导入线程模块
import threading
线程类Thread参数说明
Thread([group [, target [, name [, args [, kwargs]]]]])
group: 线程组,目前只能使用None
target: 执行的目标任务名
args: 以元组的方式给执行任务传参
kwargs: 以字典方式给执行任务传参
name: 线程名,一般不用设置
def __init__(self, group=None, target=None, name=None,
args=(), kwargs=None, *, daemon=None):
启动线程
启动线程使用start方法
线程的注意点
-
线程之间执行是无序的
-
主线程会等待所有的子线程结束后才结束
import threading
import timedef work(num):
for i in range(num):
print("I am working ")
time.sleep(0.2)if name == ‘main’:
#创建子线程并指定对应的任务
#group:线程组,一般不用,目前默认使用none
#target:执行的目标任务名
#name:线程名
#args:表示以元祖传参# sub_thread = threading.Thread(group=None,target=work,name="myThread",args=(5,)) # print(sub_thread) # sub_thread.start() #表示以字典方式传参,注意点key要参数名要一一对应 sub_thread = threading.Thread(group=None,target=work,name="myThread",kwargs={"num":3}) print(sub_thread) sub_thread.start()
自定义多线程:
import threading
class Custom_thread(threading.Thread):
def __init__(self,info1,info2):
#提示:如果子类提供了init方法,那么默认不会调用父类的init方法
#解决办法:手动调用父类的初试化方法,建议:如果子类提供了init方法,需要手动调用父类的init方法
super(Custom_thread, self).__init__()
self.info1=info1
self.info2= info2
def work1(self):
print(self.info1)
def work2(self):
print(self.info2)
#执行任务统一在run方法中执行
def run(self):
self.work1()
self.work2()
#创建自定义线程,注意点:不需要使用target指定执行某个任务,执行任务都在run方法里执行
custom_thread=Custom_thread("work1","work2")
#启动线程统一使用start方法,start方法内部调用run方法,不要直接调用run方法
custom_thread.start()
import threading
import time
# 唱歌任务
def sing():
# 扩展: 获取当前线程
# print("sing当前执行的线程为:", threading.current_thread())
for i in range(3):
print("正在唱歌...%d" % i)
time.sleep(1)
# 跳舞任务
def dance():
# 扩展: 获取当前线程
# print("dance当前执行的线程为:", threading.current_thread())
for i in range(3):
print("正在跳舞...%d" % i)
time.sleep(1)
if __name__ == '__main__':
# 扩展: 获取当前线程
# print("当前执行的线程为:", threading.current_thread())
# 创建唱歌的线程
# target: 线程执行的函数名
sing_thread = threading.Thread(target=sing)
# 创建跳舞的线程
dance_thread = threading.Thread(target=dance)
# 开启线程
sing_thread.start()
dance_thread.start()