操作系统可以同时运行多个任务,

并行:真的多任务,只能在多核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.添加超时时间

 

银行家算法

从当前状态出发,逐个按安全序列检查各客户谁能完成其工作,然后假定其能完成工作并归还全部贷款,再进行下一个能完成工作的客户。。。

如果所有客户都能完成工作,则找到一个安全序列,银行家才是安全的。