python多任务线程

来源:互联网 发布:java easyui tree例子 编辑:程序博客网 时间:2024/06/18 07:43
一、多任务概念
  • 多任务:同时执行多个任务
  • 多任务是由cpu时间片轮转的方法执行的
  • 多任务的二种方式:
    • 并发:多个任务通过cpu任务调度方法,通过时间片轮转运行多任务
    • 并行:多个cpu,同个时间点调用不同cpu执行多任务(cpu数量关系)
二、线程概念(重点)
  1.     线程:一个进程内部的一条执行流程(线程)
                主线程:原始线程 子线程:新建线程
      2.    多线程创建:
  •     threading 模块调用(多任务线程模块)
  •     Thread是一个类,创建一个线程执行计划 target指定函数 不需要调用
  •     threading.Thread(target=, args =)    
  •     target 指定线程执行的函数名
  •     args 指定需要使用的函数参数——元组
  •     返回值就是Thread的实例对象
    
  • 第一种方式:
    •   
                 1.创建任务
                     thd =  threading.THREAD(target = 需要进行的任务名称)
                 2.启动多任务
                     thd.start()
        
                 3.获取当前进程内部的线程列表
                     threading.enumerate()
                     len(threading.enumerate()显示线程数

                4.获取线程列表
                     threading.enumerate

                    默认情况下,主线程会自动等待子线程全部退出后退出
  •  第二种方式:
                  1.定义一个类,继承threading.Thread,定义要执行的新的方法
                 
                  2.主函数创建一个对象 修改run方法
                  
                  3.对象调用start()方法 调用run方法
                         线程的执行顺序是无序的 ,将运行sleep是会阻塞(Blocked)的 
                  
                   4.Thread对象.join() :(重点&&&)
                          主线程 阻塞等待—子线程结束 退出之后继续执行

       
三、多线程同步(重点*)----秩序
  1. 多线程-共享全局变量
  • 多线程进行全局变量修改,同时修改回导致数据混乱(即非线程安全)
  • 怎样解决变量的混乱,非线程的不安全?
    • 互斥锁:互斥锁保证在任何一个时间点只有 一个 任务可以获取并占有 锁资源
                            1.设置互斥锁                        
                            lock=threading.Lock()
                            2.尝试取锁,如未锁定 将被我锁定 如果锁定等待
                            lock.acquire(bloocking=True,timeout= -1)timeout 为负值,就是死等。false为不等待,不发生阻塞。
                            3.释放这把锁 —用完解锁
                            lock.release()
                    优点 保证多任务修改共享数据时能够同步 使运算结果正确
                    缺点 失多任务优势,容易造成死锁问题 
 
   四、死锁问题
                
                任务在获取锁时造成 一直在等待(死等) 锁资源 而不能成功获取
        原因:
                没有正确释放      --
                用户规范 用完一定要关
        解决办法:
                就是在获取锁的时候 使用非阻塞 或者 阻塞+超时等待 方式获取锁
                多种锁资源分配不当 -- 银行家算法可以解决该问题:
                            








原创粉丝点击