码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-07-31 17:22:52      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:img   16px   monk   strong   数据   接受   import   spawn   执行   

线程:

  队列: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

 

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

标签:img   16px   monk   strong   数据   接受   import   spawn   执行   

原文地址:https://www.cnblogs.com/Fushengliangnian/p/9396156.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!