同一个进程内的队列(多线程) 线程池

Posted 窮山霧繞(静妙)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同一个进程内的队列(多线程) 线程池相关的知识,希望对你有一定的参考价值。

一、同一个进程内的队列(多线程)

  import queue

  queue.Queue()   先进先出

  queue.LifoQueue()  后进先出

  queue.PriorityQueue()   优先级队列

    优先级队列   q = queue.PriorityQueue() 

      q.put((pri , data))   接收的是一个元祖

      元祖中第一个参数是:表示当前数据的优先级

      元祖中第二个参数是:需要存放到队列中的数据

    优先级的比较(首先保证整个队列中,所有表示优先级的东西类型必须一致)

      如果都是int,比数值的大小

      如果都是str,比较字符串的大小(从第一个字符的ASCII码开始比较),当ASCII码相同时会按照先进先出的原则

二、线程池

  在一个池子里放固定数量的线程,这些线程处于等待状态,一旦有任务来,就有线程自发的去执行任务。

  concurrent.futures   这个模块是异步调用的机制(提交任务都是用submit)

  for + submit 多个任务的提交

  shutdown  是等效于Pool中的close  +  join ,是指不允许再继续向池中增加任务,然后让父进程(线程)等待池中所有进程(线程)执行完所有任务。

  如何把多个任务扔进池中?

    要么使用for + submit  的方法去提交多个任务

    要么直接使用map(func,iterable) 方式去提交多个任务

  不同的方式提交多个任务(for + submit  或者map),拥有不同的得到结果的方式。

    如果是for + submit 的方式提交任务,想得到结果用result方法

    如果是map的方式提交任务,结果是一个生成器,采用__next__()  的方式得到结果。

  关于回调函数,不管是Pool进程池的方式,还是ProcessPoolExecutor的方式开启进程池,

          回调函数都是由父进程调用

以上是关于同一个进程内的队列(多线程) 线程池的主要内容,如果未能解决你的问题,请参考以下文章

python 多进程多线程

多线程机制

《Linux 应用编程》—第13章 Linux 多线程编程

队列与线程补充

Python线程队列与多处理管道

多线程面试经典必问题