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

线程:

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

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

时间: 2024-08-12 22:14:10

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

《Java并发编程实战》第八章 线程池的使用 读书笔记

一.在任务与执行策略之间的隐性解耦 有些类型的任务需要明确地指定执行策略,包括: . 依赖性任务.依赖关系对执行策略造成约束,需要注意活跃性问题.要求线程池足够大,确保任务都能放入. . 使用线程封闭机制的任务.需要串行执行. . 对响应时间敏感的任务. . 使用ThreadLocal的任务. 1. 线程饥饿死锁 线程池中如果所有正在执行任务的线程都由于等待其他仍处于工作队列中的任务而阻塞,这种现象称为线程饥饿死锁. 2. 运行时间较长的任务 Java提供了限时版本与无限时版本.例如Thread

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

本节目录: 1.线程队列 2.线程池 3.协程 一.线程队列 线程之间的通信我们列表行不行呢,当然行,那么队列和列表有什么区别呢? queue队列 :使用import queue,用法与进程Queue一样 queue is especially useful in threaded programming when information must be exchanged safely between multiple threads. class queue.Queue(maxsize=0)

读书笔记-----Java并发编程实战(一)线程安全性

线程安全类:在线程安全类中封装了必要的同步机制,客户端无须进一步采取同步措施 示例:一个无状态的Servlet 1 @ThreadSafe 2 public class StatelessFactorizer implements Servlet{ 3 public void service(ServletRequest req,ServletResponse resp){ 4 BigInteger i = extractFromRequest(req); 5 BigInteger[] fact

《Java并发编程实战》第二章 线程安全性 读书笔记

一.什么是线程安全性 编写线程安全的代码 核心在于要对状态访问操作进行管理. 共享,可变的状态的访问 - 前者表示多个线程访问, 后者声明周期内发生改变. 线程安全性 核心概念是正确性.某个类的行为与其规范完全一致. 多个线程同时操作共享的变量,造成线程安全性问题. * 编写线程安全性代码的三种方法: 不在线程之间共享该状态变量 将状态变量修改为不可变的变量 在访问状态变量时使用同步 Java同步机制工具: synchronized volatile类型变量 显示锁(Explicit Lock

python全栈脱产第37天------进程池与线程池、协程、gevent模块、单线程下实现并发的套接字通信

一.进程池与线程池 调用concurrent.futures下的ThreadPoolExecutor,ProcessPoolExecutor来实现 提交任务有两种方式:同步调用:提交完一个任务之后,就在原地等待,等待任务完完整整地运行完毕拿到结果后,在执行下一段代码,是串行的 异步调用:提交完一个任务之后,不在原地等待,直接运行下一段代码,任务是并发的 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutorimp

进程池与线程池、协程、协程实现TCP服务端并发、IO模型

进程池与线程池.协程.协程实现TCP服务端并发.IO模型 一.进程池与线程池 1.线程池 ''' 开进程开线程都需要消耗资源,只不过两者比较的情况下线程消耗的资源比较少 在计算机能够承受范围内最大限度的利用计算机 什么是池? 在保证计算机硬件安全的情况下最大限度的利用计算机 池其实是降低了程序的运行效率,但是保证了计算机硬件的安全 (硬件的发展跟不上软件的速度) ''' from concurrent.futures import ThreadPoolExecutor import time p

线程queue、事件event及协程

线程queue.事件event及协程 线程queue 多线程抢占资源,让其保持串行的两种方式: ? 1.互斥锁 ? 2.队列 线程队列分为以下三种: 1.Queue(先进先出) import queue q = queue.Queue(3) q.put(1) q.put(2) q.put(3) # q.put(4,block=False) # 若不设置block参数,默认为True,大于队列长度进入阻塞状态,若设置block为False,大于对列长度直接报错 print(q.get()) pri

Python-线程池、进程池,协程

线程池&进程池 在python2中没有提供,在python3之后才提供 作用:保证程序中最多可以创建的线程的个数 import time from concurrent.futures import ThreadPoolExecutordef task(n1,n2):    time.sleep(1)    print('星空不问赶路人')pool = ThreadPoolExecutor(10) # 创建线程池for i in range(100):    pool.submit(task,i

并发编程(二):线程池

相比于线程池,我们可能接触new Thread更多一点,既然有了new Thread我们为什么还要使用线程池呢? new Thread的弊端 a.每次new Thread新建对象,性能差 b.线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或者OOM(OutOfMemory) c.缺少更多功能,如更多执行.定期执行.线程中断 线程池的优势 a.重用存在的线程,减少对象创建.消亡的开销,性能好 b.可有效控制最大并发线程数,提高系统资源利用率,同时可以避免过多资源竞