Python多任务

  1. 多任务
    什么是多任务
            同时做多件事件(做个多个任务),运行多个方法
    多任务的原理
          并发:假的多任务,时间片的轮转,快速的交替运行任务
          并行:真的多任务,一个核处理一个任务
    实现多任务的三种方式
         线程
         进程
         协程

  • 线程

概念:程序执行的最小单位,依赖于进程
特点
程序运行起来,就给它创建了一个主线程,等待子线程结束后再结束
共享全局变量,通过args参数给线程传递数据
从系统开销讲,进程>线程>协程
互斥锁
       主要解决了资源竞争的问题
使用互斥锁最主要注意:死锁问题
原因:两个线程都在等待对方释放锁
解决方案:
写代码设计的时候避免
设置超时时间
银行家算法

进程
概念:它是代码和资源的集合,分配资源的最小单位,可以在任务列表中查看进程
特点
        程序运行起来,就会给其创建一个主进程,等待子进程结束后,再结束
进程调用start()方法后就进入了运行态
写时拷贝处理数据,通过args给进程传递数据
从系统开销讲,进程>线程>协程
进程间通信使用Queue
作用:多个进程之间传递数据
写法
创建队列对象q=multiprocessing.Queue()
一个进程给队列中放消息q.put()
另一个进程从队列中去消息q.get()
进程池
为什么要用进程池?
减少了创建、销毁进程的次数,从而提交效率
原理
一次性在进程池中创建多条进程,循环着去使用
写法
创建进程池po=multiprocessing.Pool()
加入任务 po.aplay_async()
关闭po.close
应用场景
任务比较多的时候
不知道有多少个任务的时候

  • 协程
    什么是可迭代对象
    一个普通的对象实现了iter内置函数
    什么是迭代器
    一个普通的对象实现了iternext内置函数
    迭代器的特点
    保存的是生成数据的方式,而不直接存储数据
    好处:节省系统空间
    什么是生成器
    它是一个特殊的迭代器
    yield
    一个普通的函数里面写了yield的话,他就是一个生成器模板
    执行函数遇到yield会阻塞
    调用next()或者send()会解阻塞
    利用yield做协程
    写多个函数,每个函数中都写yield,函数执行时遇到yield就会阻塞
    然后交替着题调用不同任务的next()方法,这样就用协程实现了多任务
    原理:
    利用线程的空闲时间去执行其他的任务
    特点:
    协程依赖于线程,线程依赖进程
    从系统开销讲,进程>线程>协程
    实现协程的三种方式
    yield next() send()
    greenlet
    gevent
    gevent.spawn(函数名).join()
    gevent.joinall([gevent.spawn(函数名)])

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章