一.协程介绍 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 协程相比于线程,最大的区别在于,协程不需要像线程那样来回的中断切换,也不需要线程的锁机制,因为线程中断或者锁机制都会对性能问题造成影响,所以协程的性能相比于线程,性能有明显的提高,尤其在线程越多的时候,优势越明显. 协程的好处: 无需线程上下文切换的开销 无需原子操作锁定及同步的开销 "原子操作(atomic operation…
昨日内容回顾 I/O模型,面试会问到I/O操作,不占用CPU.它内部有一个专门的处理I/O模块.print和写log 属于I/O操作,它不占用CPU 线程GIL保证一个进程中的多个线程在同一时刻只有一个可以被CPU执行 后续的项目,特别是处理网络请求,非常多. 实例化一个Lock(),它就是一个互斥锁 LCOK 和RLOCK互斥锁LCOK死锁rlock 递归锁递归锁不会发生死锁现象 2个进程中的线程,不会受到GIL影响.GIL是针对一个进程中的多个线程,同一时间,只能有一个线程访问CPU针对GI…
昨日内容回顾 I/O模型,面试会问到I/O操作,不占用CPU.它内部有一个专门的处理I/O模块.print和写log 属于I/O操作,它不占用CPU 线程GIL保证一个进程中的多个线程在同一时刻只有一个可以被CPU执行 后续的项目,特别是处理网络请求,非常多. 实例化一个Lock(),它就是一个互斥锁 LCOK 和RLOCK互斥锁LCOK死锁rlock 递归锁递归锁不会发生死锁现象 2个进程中的线程,不会受到GIL影响.GIL是针对一个进程中的多个线程,同一时间,只能有一个线程访问CPU针对GI…
1.协程初识,greenlet模块 2.gevent模块(需要pip安装) 一.协程初识,greenlet模块: 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. greenlet模块要自己用pip安装 #协程: #本质上是一个线程 #能够在多个任务之间切换来节省一些IO时间 #协程中任务之间的切换也消耗时间,但是开销远远小于进程线程之间的切换 #协程的意义: #在遇到IO操作的时候,切换到…
一 协程 1. 协程: 单线程下的并发,又称微线程,纤程.协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 并发真正的核心: 切换并且保持状态. 开启协程并发的执行,自己的程序把控着CPU在多个任务之间来回切换 + 保持状态. 对比操作系统控制线程的切换,用户在单线程内控制协程的切换优缺点: 2. 优点: 1. 协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级 2. 单线程内就可以实现并发的效果,最大限度的利用cpu 3. 缺点: 协程的本质是单线程,…
一.requests模块在windows下安装 Linux系统下requests的安装方法在http://docs.python-requests.org/en/latest/user/install/#install很详细. 这里主要写的是在Windows下安装requests模块的方法. 1.1.下载requests安装包(.zip文件) 地址:https://github.com/kennethreitz/requests/tarball/master 下载后解压,放到一个目录下,如放到:…
1.线程的其他方法 from threading import Thread,current_thread import time import threading def f1(n): time.sleep(1) print('子线程名称',current_thread().getName())#获取线程名 if __name__=='__main__': t1=Thread(target=f1,args=(1,)) t1.start() print('主线程名称',current_threa…
1.实现多个任务之间进行切换,yield.greenlet都没有实现检测I/O,greenlet在实现多任务切换下更简单 from greenlet import greenlet def eat(name): print(f"{name} eat 1") g2.switch('egon') # 切换 print(f"{name} eat 2") g2.switch() def play(name): print(f"{name} play 1"…
协程是一中多任务实现方式,它不需要多个进程或线程就可以实现多任务. yield能实现协程,不过实现过程不易于理解,greenlet是在这方面做了改进,通过switch. greenlet可以实现协程,不过每一次都要人为的去指向下一个该执行的协程,显得太过麻烦. python还有一个比greenlet更强大的并且能够自动切换任务的模块gevent,gevent每次遇到io操作,需要耗时等待时,会自动跳到下一个协程继续执行…
任务例子:喝水.吃饭动作需要耗时1S 单任务:(耗时20s) for i in range(10): print('a正在喝水') time.sleep(1) print('a正在吃饭') time.sleep(1) 一.多线程(耗时10s) 协程gevent模块 代码如下: # 定义一个gevent的线程阻塞规则# 任何的阻塞都将切换协程monkey.patch_all() def start(num): print('--开始执行任务{}--'.format(num)) time.sleep…