线程、进程、异步、同步、队列简单应用

并发:指任务数多于CPU核数,通过操作系统的各种任务调度算法,实现多个任务执行(实际切换任务速度快,看起来是一起执行任务)

并行:指任务数少于等于CPU核数,即任务真的是一起执行的

 

同步:指线程在访问某一资源时,获得了资源的返回结果后才执行其它操作(即先做再做)

异步:指线程在访问某一资源时,无论是否取得返回结果,都进行下一步操作;当资源返回了结果,系统自会通知线程

 

进程:指正在运行的程序,并且具有一定的独立功能

线程:是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程;一个进程中可以有多个线程的,则这个应用程序也可以称之为多线程程序

 

单线程:有多个任务也是只能依次执行,当上一个任务执行结束后,下一个任务才开始执行

多线程:有多个任务可以同时执行

主线程:就一个程序是从main方法开始,一直执行到main方法结束,就是一个主线程

 

Threading模块介绍

Python的thread模块是比较底层的模块,Python的threading模块是对thread做了一些包装,可以更加方便的被使用

 

创建线程对象:threading.Thread( target=func,args=() )

         target:指定线程执行的任务(即:函数)

            args:以元组的形式传入target函数的参数

启动线程:当调用start()时,才会真正的创建线程,并且执行

 

                    

 

 

Thread类提供了以下方法:

  run():表示线程活动的方法

  start():启动线程活动

  join(time):设置主线程等待 time 秒后再往下执行,time 为空时默认为子线程结束,多个子线程之间设置的值会叠加;

         不调用 join 方法,主线程是默认不等待子线程的,即主线程执行主线程,子线程执行子线程

  isAlive():返回线程是否活动的

  getName():返回线程名

  setName():设置线程名

  threading.currentThread():返回当前执行的线程

  threading.enumerate():返回正在运行的所有线程(list),正在运行是指线程启动后、结束之前,不包括启动前和终止后的线程

  threading.activeCount():返回正在运行的线程数量

 

继承类创建线程

  通过使用threading模块能完成多任务的程序开发,为了让每个线程的封装性更完美,可通过类来封装

  所以我们可直接从threading.Thread继承创建一个新的子类,并实例化调用start()方法启动新线程,即调用了线程的run()方法

  

 

 

线程同步

  如果多个子线程共同对某个数据修改(即全局变量),则可能出现不可预料的结果(如:数据不同步的问题),为了保证数据的正确性,需要对多个线程进行同步,同步就是协同步调,按预定的先后次序进行运行

  为了避免数据不同步的问题,就引入了锁的概念

  锁有两种状态---锁定和未锁定。每当一个线程比如‘set’要访问共享数据时,必须先获得锁定;如果已有别的线程锁定了,那么就会让“set”线程暂时停止,即同步阻塞,别的线程访问变量结束就释放锁,让下一个线程使用

  使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有 acquire() 方法和 release() 方法,对于那些需要每次只允许一个线程数据的数据,可以将其操作放到 acquirerelease 方法之间

  

        

 

       

 

 

 

队列

  Python的queue.Queue模块中提供了同步的、线程安全的队列类,包括:

    1、先进先出:FIFO(先入先出)队列Queue

    2、后进先出:LIFO(后入后出)队列LifoQueue

    3、优先级:PriorityQueue      ps:队列中的元素为元组类型:(优先级,数据)

  初始化Queue()对象时,若括号中没有传指定最大可接收的消息数量,或数量为负值,那么就代表可接受的消息数量没有上限;

  队列(先进先出)Queue 模块中的常用方法

  -- Queue.qsize() :返回队列的大小,即包含的消息数量

  -- Queue.empty():如果队列为空,返回True,反之False

  -- Queue.full():如果队列满了,返回True

  -- Queue.full:与maxsize大小对应

  -- Queue.get( [ block [, timeout] ] ):获取队列,block:是否等待,默认为ture,timeout:等待时间

  -- Queue.get_nowait( item ):写入队列,timeout等待时间

  -- Queue.put( item ,block=Ture, timeout=None ):写入队列,block:是否等待,默认为ture,timeout等待时间

  -- Queue.put_nowait( item ):相当于Queue.put ( item, False )

  -- Queue.task_done():在完成一项工作后,Queue.task_done()函数向任务已经完成的队列发送一个信号

  --Queue.join():实际上意味着等到队列为空,再执行别的操作,即判断队列中的任务是否执行完毕

 

进程之间不共享全局变量即各用各的全局变量,互不影响

 

 

multiprocessing模块

  -- Process( [group [, target [, name [, args [, kwargs]]]] ] )

    ~ target:如果传递了函数的引用,可以任务这个子进程就执行这里的代码

    ~ args:给target 指定的函数传递的参数,以元组的方式传递

    ~ kwargs:给target指定的函数传递命名参数

    ~ name:给进程设定一个名字,可以不设定

    ~ group:指定进程组,一般用不到

  -- Process 创建的实例对象的常用方法

     ~ start():启动子进程实例(创建子进程)

    ~ is_alive():判断进程子进程是否还活动着

    ~ join([ timeout ]):是否等待子进程执行结束,或等待多少秒

    ~ terminate():不管任务是否完成,立即终止子进程

  -- Process 创建的实例对象的常用属性

    ~ name:当前进程的别名,默认为Process-N,N为从1开始递增的整数

    ~ pid:当前进程的pid (进程号)

 

 

 

 

 

 

 

 

 

 

 

 

 

  

posted @ 2022-01-21 17:50  哩子吖  阅读(171)  评论(0)    收藏  举报