一、协程

协程: 单线程下的并发,又称 微线程。协程是一种用户态的的轻量级线程,即协程是由用户程序自己控制调度的。

协程的本质就是在单线程下,由用户自己控制一个任务,遇到 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 并发编程之协程的更多相关文章

  1. python并发编程之协程知识点

    由线程遗留下的问题:GIL导致多个线程不能真正的并行,CPython中多个线程不能并行 单线程实现并发:切换+保存状态 第一种方法:使用yield,yield可以保存状态.yield的状态保存与操作系 ...

  2. 32 python 并发编程之协程

    一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...

  3. 四 python并发编程之协程

    一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...

  4. python并发编程之协程(实践篇)

    一.协程介绍 协程:是单线程下的并发,又称微线程,纤程.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 对于单线程下,我们不可避免程序中出现io操作,但如果我们 ...

  5. 第十篇.5、python并发编程之协程

    一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...

  6. 第 12 章 python并发编程之协程

    一.引子 主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只用一个)情况下实现并发,并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作 ...

  7. 37、python并发编程之协程

    目录: 一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二 一 引子 本节的主题是基于单线程来 ...

  8. python并发编程之协程

    ---恢复内容开始--- 一.join方法 (1)开一个主线程 from threading import Thread,currentThread import time def walk(): p ...

  9. python全栈开发从入门到放弃之socket并发编程之协程

    一.为什么会有协程 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情 ...

随机推荐

  1. Linux下MySQL数据库主从同步配置

    说明: 操作系统:CentOS 5.x 64位 MySQL数据库版本:mysql-5.5.35 MySQL主服务器:192.168.21.128 MySQL从服务器:192.168.21.129 准备 ...

  2. MongoDB的聚合函数 Aggregate

    Aggregate的使用,有利于我们对MongoDB中的集合进行进一步的拆分. 示例: db.collection.aggregate( {$match:{x:1}, {limit:10}, {$gr ...

  3. Oracle中查询关键字select--from--where--group by--having--order by执行顺序

    select--from--where--group by--having--order by 这6个查询关键字的执行顺序: 1.from组装来自不同数据源的数据:2.where基于指定的条件对记录行 ...

  4. Jersey统一异常处理

    众所周知,java服务提供者提供给服务请求者应该是特定格式的数据,而不能出现异常栈类似信息,那么jersey中,如何添加统一的异常处理呢? 针对jersey启动如果是实现了ResourceConfig ...

  5. DIV滚动样式

    .divScroll{     OVERFLOW:auto;        scrollbar-face-color: #FFFFFF;        scrollbar-shadow-color: ...

  6. .net编程知识点

    一.编程思想 OOP(面向对象) 面向对象三大特性(多态如何体现)及五项原则 AOP(面向切面编程) 面向切面编程静态植入和动态植入 二.c#23种设计模式 三.Castle是针对.NET平台的一个开 ...

  7. java.util.regex.Pattern正则表达式写验证器示例

    import java.util.regex.Pattern; /** * 校验器:利用正则表达式校验邮箱.手机号等 * */ public class Validator { /** * 正则表达式 ...

  8. Mysql性能调优方法

    第一种方法 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的 性能,我们可以将表中字 ...

  9. SQLAlchemy的使用---数据库的创建与连接

    # 1. 导入SQLAlchemy from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Col ...

  10. javascript接入阿里云服务器

    authInfo = r.data.authInfo[0]//后台请求的 var client = new OSS({ region: 'oss-cn-beijing',// 云账号AccessKey ...