python 并发编程之协程
一、协程
协程: 单线程下的并发,又称 微线程。协程是一种用户态的的轻量级线程,即协程是由用户程序自己控制调度的。
协程的本质就是在单线程下,由用户自己控制一个任务,遇到 io 阻塞就切换另外一个任务去执行,以此来提升效率。
1、python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其他线程运行)
2、单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换,以此来提升效率(!!!非io操作的切换与效率无关)
对比操作系统控制线程的切换,用户在单线程内控制协程的切换:
优点:
- 协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级
- 单线程内就可以实现并发的效果,最大限度地利用cpu
缺点:
- 协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程
- 协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程
gevent
import gevent
import time
def run(name):
    print('%s is running 1 ...' %name)
    gevent.sleep(3)
    print('%s is running 2 ...' %name)
def jump(name):
    print('%s is jumping 1 ...' %name)
    gevent.sleep(4)
    print('%s is jumping 2 ...' %name)
start_time = time.time()
g1 = gevent.spawn(run, 'fury')
g2 = gevent.spawn(jump, 'tiger')
g1.join()
g2.join()
stop_time = time.time()
print(stop_time - start_time)
--- 执行结果 ---
fury is running 1 ...
tiger is jumping 1 ...
fury is running 2 ...
tiger is jumping 2 ...
4.00600004196167
分析: run()  中  gevent.sleep(3)   ,切到 jump() ,jump() 中执行到  gevent.sleep(4) 时候,又切到 run() ,run() 中  gevent.sleep(3)   ,3s 还没完,又切回到 jump() ,就这样反复切, 然后 fun()  3s 结束后,执行下面的代码,然后又执行 jump() 中的代码
最后的执行时间,与  jump() 中 gevent.sleep(4)  的4s 很接近,
from gevent import monkey;monkey.patch_all()  # 打补丁 将下面涉及到 io 操作的都上标记,这样,不是gevent的io 操作,也可以被  gevent 识别啦
# 不加上面这句,下面代码执行后遇到io 是不切,而是直接 time.sleep() 睡眠的
import gevent
import time
def run(name):
    print('%s is running 1 ...' %name)
    time.sleep(3)
    print('%s is running 2 ...' %name)
def jump(name):
    print('%s is jumping 1 ...' %name)
    time.sleep(4)
    print('%s is jumping 2 ...' %name)
start_time = time.time()
g1 = gevent.spawn(run, 'fury')
g2 = gevent.spawn(jump, 'tiger')
g1.join()
g2.join()
stop_time = time.time()
print(stop_time - start_time)
python 并发编程之协程的更多相关文章
- python并发编程之协程知识点
		由线程遗留下的问题:GIL导致多个线程不能真正的并行,CPython中多个线程不能并行 单线程实现并发:切换+保存状态 第一种方法:使用yield,yield可以保存状态.yield的状态保存与操作系 ... 
- 32 python 并发编程之协程
		一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ... 
- 四 python并发编程之协程
		一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ... 
- python并发编程之协程(实践篇)
		一.协程介绍 协程:是单线程下的并发,又称微线程,纤程.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 对于单线程下,我们不可避免程序中出现io操作,但如果我们 ... 
- 第十篇.5、python并发编程之协程
		一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ... 
- 第 12 章 python并发编程之协程
		一.引子 主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只用一个)情况下实现并发,并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作 ... 
- 37、python并发编程之协程
		目录: 一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二 一 引子 本节的主题是基于单线程来 ... 
- python并发编程之协程
		---恢复内容开始--- 一.join方法 (1)开一个主线程 from threading import Thread,currentThread import time def walk(): p ... 
- python全栈开发从入门到放弃之socket并发编程之协程
		一.为什么会有协程 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情 ... 
随机推荐
- ORACLE 查询被锁定表及解锁释放session的方法
			后台数据库操作某个表时处于假死状态,可能该表被某个用户锁定,导致其他用户无法继续操作, 如下是解决方案和实例. 查被锁的表,以及用户 SELECT object_name, machine, s.si ... 
- hrb——开锁魔法I——————【规律】
			解题思路:从1到n的倒数之和. #include<stdio.h> #include<string.h> #include<algorithm> using nam ... 
- 【ubuntu】给新装好的UBUNTU系统配置静态IP
			最近在自己装有win7系统的thinkpad电脑上,给安装了Ubuntu16.04双系统. 想在ubuntu下配置一个hadoop伪分布式,最首要的就是要给系统配置一个静态IP . 一开始我按照网上的 ... 
- tomcat8.5.8遇到的两个问题
			压力测试场景,前端nginx反向代理到4个tomcat实例,在其中的一个实例上产生了大量的countDownConnection Incorrect connection count警告 WARNIN ... 
- oracle OTT 学习
			1.OTT概念 OTT 是 Object Type Translator 的缩写,对象类型转换器.它是用来将数据库中定义的类型(UDT)转换为C结构体类型的工具.借助OTT 可以用C语言调用OCI来访 ... 
- mysql三:表操作
			一.存储引擎介绍 存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制. 详见:点击查看 二.表的介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标 ... 
- windows RT开发笔记:WinRT DLL及其调用研究
			一. 几个概念: WinRT : Windows Runtime, windows运行时.创建Windows运行时(WinRT)是为了在Windows上给用户提供一种流畅且安全的应用体验.WinRT会 ... 
- matlab练习程序(随机游走图像)
			随机游走类似布朗运动,就是随机的向各个方向走吧. 虽然代码没什么技术含量,不过产生的图像实在太漂亮了,所以还是贴上来吧. 产生的图像: matlab代码如下: clear all;close all; ... 
- mysql的sql_mode介绍和修改
			原文链接: http://blog.csdn.net/wulantian/article/details/8905573 mysql目录下有一个配置文件my.conf. mysql数据库有一个环境 ... 
- maven---Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom:2.12.4
			Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom:2.12.4 Failure to transfer or ... 
