并发编程 之 线程的队列, 线程池; 以及协程

Posted fushengliangnian

tags:

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

线程:

  队列:Queue
   from queue import Queue

    特点:
      先进先出

      自带锁, 数据安全
    方法:
      put() 添加
      get() 获取

      put_nowait()

      get_nowait()

      full()

      empty()

      qsize()

和普通的队列用法一样, 详情 请看 进程之队列

 


  :LifoQueue
   from queue import LifoQueue


    后进先出

    自带锁, 数据安全

  优先级队列:PriorityQueue
   from queue import PriorityQueue

    put((tulp)) 参数接受一个元组, 该元组为两个元素, 第一个表示优先级的int, int越小优先级越大

  线程池: from concurrent.futures import ThreadPoolExecutor

    1, threading 里没有 线程池相关的内容, 在后面的时候,有人写了一个 concurrent.futures来帮助我们管理 线程/进程 池

    concurrent.futures模块中的进程池和线程池
      高度封装
      进程/线程池 的统一使用方式:

 

协程:

  简介:在一条线程的基础上,在多个任务之间互相切换
    节省线程开启的时间消耗, 且协程是从python代码级别进行调度的.

  yield:
    1, yield 与 next() 与send() 的配合 就是一个最基础的协程.
    2, 只做到了程序之间的切换,没有重利用任何IO操作的时间

  第三方模块: greenlen
   from greenlet import greenlet

    此模块是用来帮助我们来进行协程之间的转换.
    方法:
      switch() 切换

技术分享图片协程内容介

  第三方模块: gevent
   import gevent

    此模块是基于greenlen模块开发的一个自动遇见阻塞则切换的模块( 此乃神器)
    同时 此机制, 充分利用了 IO操作产生的空闲时间. 使得程序更快
    spawn(fu) 将fu函数 设置为协程
    sleep() 堵塞
    join() 堵塞
    joinall([list]) 等待列表中的 协程全部执行完毕后解除堵塞.

  注意: gevent 只认识自己的堵塞状态, 若想让其认识其他的需要借助 monkey

  帮助gevent 认识其他阻塞: monkey.patch_all()
   from gevent import monkey;monkey.patch_all() 写在其他模块导入之前

    monkey.patch_all() 是将下面所有模块的堵塞状态进行记录

技术分享图片
 1 # 使用协程减少IO操作带来的时间消耗
 2 from gevent import monkey;monkey.patch_all()
 3 import gevent
 4 import time
 5 
 6 def eat():
 7     print()
 8     time.sleep(2)
 9     print(吃完了)
10 
11 def play():
12     print(玩儿)
13     time.sleep(1)
14     print(玩儿美了)
15 
16 g1 = gevent.spawn(eat)
17 g2 = gevent.spawn(play)
18 gevent.joinall([g1,g2])
19 # g1.join()
20 # g2.join()
21 # 没执行
22 # 为什么没执行???是需要开启么?
23 # 没有开启但是切换了
24     # gevent帮你做了切换,做切换是有条件的,遇到IO才切换
25     # gevent不认识除了gevent这个模块内以外的IO操作
26     # 使用join可以一直阻塞直到协程任务完成
27 # 帮助gevent来认识其他模块中的阻塞
28     # from gevent import monkey;monkey.patch_all()写在其他模块导入之前
gevent

 




































以上是关于并发编程 之 线程的队列, 线程池; 以及协程 的主要内容,如果未能解决你的问题,请参考以下文章

并发编程目录

线程进阶之线程队列线程池和协程

JUC并发编程 共享模式之工具 线程池 -- 自定义线程池(阻塞队列)

十:并发编程之Executor线程池原理与源码解读

JUC并发编程 共享模式之工具 ThreadPoolExecutor -- 任务调度线程池 定时任务 / 延时执行(ScheduledThreadPoolExecutor 延时执行 / 定时执行)(代

并发编程补充知识之标准线程池