两个任务同时执行
并发:cpu<当前执行的任务,假的多任务,简单来说,单核的cpu,时间片轮转调度;并行:cpu>当前执行的任务,是真的多任务,简单来说,双核或四核cpu。实现多任务的三种方式:
线程:被包含于进程,是操作系统能够进行运算调度的最小单位;举个例子:微信里聊天,微信是个进程,而每一个聊天的对象就是线程;进程:协程:用python实例使用线程完成多任务
import time import threading #内置模块 def demo(): print("Hello Word") time.sleep(1) if __name__ == '__main__': # for i in range(4): # demo()#循环一次,调用一次,并不是同时执行 for i in range(3): #1.实例化线程类 t = threading.Thread(target=demo) #2.启动线程 t.start() #线程实现多任务,同时调用demo(),同时打印出Hello World好吧,这不直观,请看下一个例子
import time import threading def exercise(): for i in range(3): print(f"正在运动{i}") time.sleep(1) def listen_music(): for i in range(3): print(f"正在唱歌{i}") time.sleep(1) if __name__ == '__main__': t1=threading.Thread(target=exercise) t2=threading.Thread(target=listen_music) t1.start() t2.start() #结果 正在运动0 正在唱歌0 正在运动1 正在唱歌1 正在运动2 正在唱歌2 #唱歌和运动同时执行-注意:当主线程执行完毕,但是仍然会等子线程结束,主线程才会结束,所以添加 守护线程
守护线程 也就是说不会等子线程结束 使用方法:t.setDaemon(True) 实现子线程结束完毕,主线程才继续执行呢? 使用方法:t.join()
查看线程数量 当调用Thread的时候,不会创建线程。 当调用Thread创建出来的实例对象的start方法的时候,才会创建线程以及开始运行这个线程。
继承Thread类创建线程
""" 继承Thread类创建线程 """ import threading import time # 1.创建A类 继承Thread类 class A(threading.Thread): # 2.在类的内部重写 run (只能是run) def run(self): for i in range(3): print(i) # self.demo() #同时启动线程 time.sleep(1) # 如果类里面有其他方法实现线程,在run里面进行调用 def demo(self): print("demo") if __name__ == '__main__': # 3.实例化类 t = A() print(threading.enumerate()) # 4.创建子线程 启动 t.start() print(threading.enumerate()) # t.demo() # 普通的调用 t.run()多线程共享全局变量(线程间通信) 线程当中共享全局变量
多线程之间传参
多线程中,各资源会相互竞争,没有次序,谁进行的快,谁抢到的资源就越多。 两个进程,左右边正常顺序123,但是左边进行了12,跳到右边进行12,不按正常顺序走,程序就会紊乱。解决方案看第九天进阶学习哦。