一、多任务
并发:执行的任务数大于cpu核数,使用调度方法,不是同时进行的,总有些任务时不执行的在同一时刻
并行:任务数量小于cpu核数,任务是同时进行的
线程同步:按照预定的先后顺序执行
二、线程
(1)定义:线程是进程的一个分支,每个进程最少一个线程,是cpu调度和分派的最小单元
#导入线程模块
import threading
threading.Thread( target= ,args= (,),kwargs={‘name’: ,})
*
target: 执行的目标任务名,通常为某个运行方法,后边不加括号
*
args: 以元组的方式给执行任务传参
*
kwargs: 以字典方式给执行任务传参
启动
线程.start()
(2)常用方法
获取活动线程的列表: threading.enumerate()
获取活动线程的个数:threading.active_count()
获取当前执行的线程:threading.current_thread()
(3)线程的注意点:
1.线程是无序的
2.主线程会等待子线程结束后才结束
3.可以设置守护主线程,当主线程结束,子线程会直接销毁不在执行子线程的代码
设置守护主线程:
方法1:threading.Thread(tareage=,daemon=True)
方法2:线程.setDaemon(True)
(4)自定义线程:
要继承Thread,并且要覆盖run()方法,
run()方法中可以启动线程任务,但是在最后不能直接掉用run()方法,只能实例化类名.start(),start会默认调用run方法。
继承treading.Thread ,当需要重写Thread中的init的时候, super(MyThread, self).init()
(5)多线程的资源竞争
资源竞争:当多线程对全局变量进行修改的时候,会出现错误
解决办法:
1.延时, sleep()
2.线程等待,线程.join() 主线程等待这个线程执行完以后再执行后边的代码,线程等待会让多线程变成单线程执行,效率低
3.互斥锁
(6)互斥锁
保证每次只有一个线程进行写入操作,保证写入数据的正确性
创建锁
mutex = threading.Lock()
锁定
mutex.acquire()
释放
mutex.release()
使用不好易出现死锁现象