2019独角兽企业重金招聘Python工程师标准>>>

借鉴地址:https://segmentfault.com/a/1190000000534263

首先搞明白协程是什么。

对比来说,子例程是指某个主程序的一部分代码,可以是函数,方法,子程序什么的,而协程与子例程一样是程序组件,子例程是惟一入口,一次返回的一套过程,而协程可以通过yield来在过程间切换,调用其它协程。

def producer():print "生产一个"consumer()def consumer():print "消费一个"producer()

假设现在有个生产者producer和consumer,buffer空的时候消费调生产,满的时候生产调消费

能发现程序有明显问题,因为没有返回,会不断占用栈空间。

那么用进程,线程处理呢?可以实现,但会因为上下文切换,资源抢占造成开销。

于是,伟大的人类发明了用户级别而非系统级别上的“线程”,它能保留上一次调用的状态,起始是第一个入口点,返回的是接下来的入口点。一个协程通过yield交出控制权到另一个协程。

这个过程实际是模拟了线程的上下文切换,即“退出时保存现场,下一次唤醒后继续执行”,但协程是用户态的,由程序员自己出入控制权而不是系统调度,系统大人并不认识它。

用greenlet举例子:

import random
from time import sleep
from greenlet import greenlet
from Queue import Queuequeue = Queue(3)@greenlet
def producer():chars = ['a', 'b', 'c', 'd', 'e']global queuewhile True:char = random.choice(chars)queue.put(char)print "Produced: ", charsleep(1)if queue.full():consumer.switch()@greenlet
def consumer():global queuewhile True:char = queue.get()print "Consumed: ", charsleep(1)if queue.empty():producer.switch()if __name__ == "__main__":producer.run()consumer.run()

console:

Produced:  d
Produced:  e
Produced:  a
Consumed:  d
Consumed:  e
Consumed:  a
Produced:  e
Produced:  c
Produced:  a
Consumed:  e

可以看到在符合条件时进程交出控制权到另外一个

(以下转自上述链接原文)

应用场景

我们一直都在大谈协程是什么样一个东西,却从没有提起协程用来干嘛,这个其实大家分析一下就能够知道。从上面的生产者——消费者问题应该能看出,它分别有两个任务,假设交给两个人去执行,但每次只能允许一个人行动。当缓冲区满的时候,生产者是出于等待状态的,这个时候可以将执行任务的权利转交给消费者,当缓冲区空得时候,消费者是出于等待状态的,这个时候可以将执行任务的权利转交给生产者,是不是很容易联想到多任务切换?然后想到线程?最后想到高并发

但同学们又会问,既然有了线程为什么还要协程呢?因为线程是系统级别的,在做切换的时候消耗是特别大的,具体为什么这么大等我研究好了再告诉你;同时线程的切换是由CPU决定的,可能你刚好执行到一个地方的时候就要被迫终止,这个时候你需要用各种措施来保证你的数据不出错,所以线程对于数据安全的操作是比较复杂的。而协程是用户级别的切换,且切换是由自己控制,不受外力终止。

总结

协程其实模拟了人类活动的一种过程。例如:你准备先写文档,然后修复bug。这时候接到电话说这个bug很严重,必须立即修复(可以看作CPU通知)。于是你暂停写文档,开始去填坑,终于你把坑填完了,你回来写文档,这个时候你肯定是接着之前写的文档继续,难道你要把之前写的给删了,重新写?这就是协程。那如果是子例程呢?那你就必须重新写了,因为退出之后,栈帧就会被弹出销毁,再次调用就是开辟新的栈空间了。

总结:协程就是用户态下的线程,是人们在有了进程、线程之后仍觉得效率不够,而追求的又一种高并发解决方案。为什么说是用户态,是因为操作系统并不知道它的存在,它是由程序员自己控制、互相协作的让出控制权而不是像进程、线程那样由操作系统调度决定是否让出控制权。

转载于:https://my.oschina.net/u/2247638/blog/880012

gevent的碎碎念(一)——协程相关推荐

  1. python gevent async_详解python之协程gevent模块

    进程.线程.协程区分 我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译为协同的例程,一般我们都简称为协程. 在linux系统中,线程就是轻量级的进程,而我们 ...

  2. python3协程 queue_使用gevent库+queue模块实现多协程爬虫,提高爬取效率!

    协程是干什么的? 协程可以提高任务执行的效率!它的执行原理就是当计算机在执行某个任务的时候,如果需要等待(比如爬取网站需要等待网站响应等),可以先去执行其他的任务,等等待结束(网站响应)时,再回来继续 ...

  3. python 协程池gevent.pool_进程池\线程池,协程,gevent

    目录 1. 进程池与线程池 2. 协程 3. gevent 4. 单线程下实现并发的套接字通信 首先写一个基于多线程的套接字 服务端: from socket import * from thread ...

  4. python3之协程(4)---gevent实现协程操作

    原文链接:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140750308 ...

  5. python中的协程:greenlet和gevent

    协程是一中多任务实现方式,它不需要多个进程或线程就可以实现多任务. 1.通过yield实现协程: 代码: import time def A():while 1:print('------A----- ...

  6. python之gevent模块实现协程

    Python通过yield提供了对协程的基本支持,但是不完全.而第三方的gevent为Python提供了比较完善的协程支持. gevent是第三方库,通过greenlet实现协程,其基本思想是: 当一 ...

  7. python gevent服务器_python gevent 协程

    简介 没有切换开销.因为子程序切换不是线程切换,而是由程序自身控制,没有线程切换的开销,因此执行效率高, 不需要锁机制.因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断 ...

  8. python携程使用_简单了解python gevent 协程使用及作用

    简介 没有切换开销.因为子程序切换不是线程切换,而是由程序自身控制,没有线程切换的开销,因此执行效率高, 不需要锁机制.因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断 ...

  9. gevent 协程 使用

    Python通过yield提供了对协程的基本支持,但是不完全.而第三方的gevent为Python提供了比较完善的协程支持. gevent是第三方库,通过greenlet实现协程,其基本思想是: 当一 ...

  10. python gevent pool_python 协程编程之gevent

    前言:协程又称微线程,英文名coroutine.协程是用户态的一种轻量级线程,是由用户程序自己控制调度.基于这一原理,协程能在单线程下实现并发.我们知道进程是操作系统分配资源的基本单位,线程是CPU任 ...

最新文章

  1. 信息传递服务器,AJAX的与服务器之间的信息传递原理(初学)
  2. 如何使用 dotTrace 来诊断 netcore 应用的性能问题
  3. 对象映射工具AutoMapper介绍
  4. 用python批量下载网络图片_python批量下载图片的三种方法
  5. Windows Server 2008 R2无密码共享设置
  6. 基于Redis+Kafka的首页曝光过滤方案
  7. java web 锁_Java中锁的分类
  8. Thread 类的属性和方法
  9. thinkphp-更新数据update函数
  10. 快速在指定文件夹打开命令行
  11. 147.有序数组的TwoSum(力扣leetcode) 博主可答疑该问题
  12. 大数据下的数据分析平台架构
  13. tcpdump 安装 使用及详解
  14. 洛谷P1551 亲戚
  15. SpringBoot系列:Spring Boot集成定时任务Quartz,java百度云短信发送
  16. no such file or directory, open '/Users/anna/package.json'的解决
  17. 经典五大算法思想-------入门浅析
  18. 清华大学霸榜计算机学科第一!2022 USNews世界大学排名出炉!
  19. 漫画算法python篇_漫画算法:小灰的算法之旅(Python篇)(全彩)
  20. 基金年华收益率计算方法

热门文章

  1. 海量数据面试题----分而治之/hash映射 + hash统计 + 堆/快速/归并排序
  2. Hadoop基础-配置历史服务器
  3. Linux下C编程-----IO/文件操作 模拟linux ls程序显示文件系统树形结构(2)
  4. 医药吧网API接口开放
  5. 随记:Ubuntu12.04下关闭图形界面的相关问题
  6. Office 2013中mathtype 6.x的安装方法简介
  7. windows用户态程序的Dump
  8. HBase常用操作备忘
  9. Oracle的回收站和闪回查询机制(二)
  10. ORA-28056,安装Oracle出错