操作系统可以同时运行多个任务,
并行:真的多任务,只能在多核cpu上实现(任务数小于核数)
并发:假的多任务(时间片轮转,优先级调动实现)
线程
线程就是实现多任务的一种手段
一个程序运行起来之后一定有一个执行代码的东西,这个就是线程
查看线程数
import threading
import time
def test1():
for i in range(5):
print("--test1--%d --" %i)
time.sleep(1)
def test2():
for i in range(10):
print("--test1--%d --" %i)
time.sleep(1)
def main():
t1 = threading.Thread(target= test1)
t2 = threading.Thread(target= test2)
t1.start()
t2.start()
while True:
print(threading.enumrate())
if len(threading.enumrate())<= 1:
break
time.sleep(1)
if __name__ = "__main__":
main()
主线程结束,子线程也结束,一个函数结束一个线程也结束,线程创建完后谁先执行不确定,但可以采取延时的方法控制谁先执行。
当调用Thread的时候不会创建线程,
当调用Thread创建出来的实例对象的start方法的时候才会创建线程以及让这个线程开始运行
多线程共享全局变量
多线程开发容易引发资源竞争,可能引发资源竞争问题,
使用互斥锁解决资源竞争问题
同步的概念
当多个线程几乎同时修改某一个共享数据时,需要同步控制,
同步就是协同步调,按预定的先后次序进行,如你说完,我在说
互斥锁
某个线程要更改共享数据时,先让其处于锁定状态,其他线程不能更改,直到该线程释放该资源,状态改为非锁定
从而保证了多线程情况下数据的正确性
#创建锁,默认没有上锁
suo = threading.Lock()
#锁定(如果之前没有锁,则上锁成功,如果之前已经锁了,那么将堵塞至解锁)
suo.acquire()
#释放
suo.release()
多线程解决并发问题,
死锁
线程共享多个资源时,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁
一旦发生就会造成应用的停止响应
1.程序设计时尽量避免死锁 2.添加超时时间
银行家算法
从当前状态出发,逐个按安全序列检查各客户谁能完成其工作,然后假定其能完成工作并归还全部贷款,再进行下一个能完成工作的客户。。。
如果所有客户都能完成工作,则找到一个安全序列,银行家才是安全的。