#coding:utf-8-*-
'''协程(coroutine)又称微线程、纤程,是一种用户级的轻量级线程。协程有自己的寄存器上下文和栈。携程调度时,将寄存器上下文和栈
保存,在切换回来的时候恢复保存的寄存器上下文和栈。所以每次重入时,就相当于进入上一次的调用状态,在并发编程中协程与线程类似,每个协
程标识一个执行单元有自己的本地数据与其他协程共享全局数据和资源。
协程需要用户自行编写调度逻辑,对CPU来讲协程是单线程的,所以CPU不用考虑怎么调度、切换上下文节约CPU开销,所以协程在一定程度上
又优于多线程。
python在默认提供了yield对协程进行基本的支持,但不完全,建议使用第三方库:gevent,其提供了比较完善的协程支持。
gevent对协程的支持,本质上来讲是greenlet在实现切换工作,greenlet的工作流程如下:
---加入IO操作出现阻塞,greenlet就显示的切换到另一端没有被阻塞的代码段执行,指导原先的阻塞状态消失,在切换回原来的代码段
继续执行。
gevent为我们自动切换协程就保证了总有greenlet在运行而不是等待IO操作,这就是协程比多线程效率高的原因''' #gevent的使用
# from gevent import monkey
# # from gevent import monkey.patch_all
# import gevent
# import urllib2
# from idlelib.rpc import response_queue
# from greenlet import greenlet
# def run_task(url):
# print("Visit-->%s"%url)
# try:
# response=urllib2.urlopen(url)
# date=response.read()
# print('%d bytes received from %s' %(len(date),url))
# except Exception as e:
# print(e)
# if __name__=="__main__":
# urls=['https://github.com/','https://www.python.org/','http://cnblogs.com/']
# greenlets=[gevent.spawn(run_task,url)for url in urls]
# gevent.joinall(greenlets)
#以上主要使用了gevent中的spawn方法和joinall方法, spawn用来形成协程,joinall方法用来添加这些任务并启动
#以上三个网络操作是并发执行的而结束顺序不同,但实际只有一个线程
#-------------------------------------------------------------------------------------
#使用gevent的pool对象进行动态数量的greenlent并发管理
from gevent import monkey
monkey.patch_all()
import urllib2
from gevent.pool import Pool
def run_task(url):
print('Visit-->%s'%url)
try:
response=urllib2.urlopen(url)
data=response.read()
print('%d bytes reveived from %s.' %(len(data),url))
except Exception as e:
print(e)
return 'url:%s-->finish'%url
if __name__=="__main__":
pool=Pool(2)
urls=['https://github.com/','https://www.python.org/','http://www.cnblogs.com/']
results=pool.map(run_task,urls)
print(results)
#以上程序中Pool对象对协程的并发数量进行了管理,先访问了前两个网址,当其中一个任务完成时才会访问第三个

Python 通过gevent实现协程的更多相关文章

  1. Python使用gevent实现协程

    Python中多任务的实现可以使用进程和线程,也可以使用协程. 一.协程介绍 协程,又称微线程.英文名Coroutine.协程是Python语言中所特有的,在其他语言中没有. 协程是python中另外 ...

  2. python的进程/线程/协程

    1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...

  3. python进阶——进程/线程/协程

    1 python线程 python中Threading模块用于提供线程相关的操作,线程是应用程序中执行的最小单元. #!/usr/bin/env python # -*- coding:utf-8 - ...

  4. Gevent的协程实现原理

    之前之所以看greenlet的代码实现,主要就是想要看看gevent库的实现代码. .. 然后知道了gevent的协程是基于greenlet来实现的...所以就又先去看了看greenlet的实现... ...

  5. Python程序中的协程操作-gevent模块

    目录 一.安装 二.Gevent模块介绍 2.1 用法介绍 2.2 例:遇到io主动切换 2.3 查看threading.current_thread().getName() 三.Gevent之同步与 ...

  6. 31、Python程序中的协程操作(greenlet\gevent模块)

    一.协程介绍 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 对比操作系统控制线程的切换,用 ...

  7. python 并发编程 基于gevent模块 协程池 实现并发的套接字通信

    基于协程池 实现并发的套接字通信 客户端: from socket import * client = socket(AF_INET, SOCK_STREAM) client.connect(('12 ...

  8. python学习道路(day11note)(协程,同步与异步的性能区别,url爬网页,select,RabbitMq)

    1.协程 #协程 又称微线程 是一种用户的轻量级线程 程序级别代码控制 就不用加机器 #不同函数 = 不同任务 A函数切到B函数没有进行cpu级别的切换,而是程序级别的切换就是协程 yelied #单 ...

  9. 11.python之线程,协程,进程,

    一,进程与线程 1.什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行 ...

随机推荐

  1. 20155220 Exp2 后门原理与实践

    20155220 Exp2 后门原理与实践 1.Windows获得Linux Shell 在windows下,打开CMD,使用ipconfig指令查看本机IP 然后使用ncat.exe程序,ncat. ...

  2. 20155320 Exp7 网络欺诈防范

    20155320 Exp7 网络欺诈防范 [基础问题回答] (1)通常在什么场景下容易受到DNS spoof攻击 乱点链接或者连公共场合的免费WiFi也容易受到攻击,尤其是那种不需要输入密码直接就可以 ...

  3. 【HNOI2016】矿区

    题面 题解 知识引入 1. 平面图 一个图\(G=(V,E)\),若能将其画在平面上,且任意两条边的交点只能是\(G\)的顶点,则称\(G\)可嵌入平面,或称\(G\)是可平面的. 可平面图在平面上的 ...

  4. Kubernetes学习之路(十九)之Kubernetes dashboard认证访问

    Dashboard:https://github.com/kubernetes/dashboard 一.Dashboard部署 由于需要用到k8s.gcr.io/kubernetes-dashboar ...

  5. libgdx自制简易版Don't Touch The White Tile

    Don't Toutch The White说来也奇快,本来没什么难的,但是在欧美ios榜上却雄踞榜首好长时间.即使是在国内,也很火,还真是想不通,谁能解释下,难道真是所谓的抓住了用户的G点,或是这些 ...

  6. Express入门介绍vs实例讲解

    下午在团队内部分享了express相关介绍,以及基于express的实例.内容提纲如下. 什么是Express 为什么要用Express 路由规则 一切皆中间件 实例:Combo Applicatio ...

  7. Git提交空目录

    1.git仅跟踪文件的变动,不跟踪目录.如果需要提交空目录,可以在里面添加 .gitignore 文件,方法如下: find . -type d -empty -exec touch {}/.giti ...

  8. #个人博客作业Week1——浏览教材后提出的5个问题

    1.对于MSF的团队模型,请问是团队中的哪个角色监督9项原则的实现?是否会浪费时间和精力在践行9项原则上?2.在调查用户需求和用户体验时如何让不同阶层的用户更多的参与度?3.想成为一位优秀的PM需要从 ...

  9. linux内核分析第三次实验

    http://blog.sina.com.cn/s/blog_78e559950102wo67.html

  10. APP相关问题汇总

    APP试用过程中,我们的APP存在不少的问题,下面是一些试用者和我们自己发现的一些问题以及一些建议. 1.APP界面有些老气,界面之间过渡僵硬 2.在试用中会出现闪退情况 3.由于我们使用的是绝对布局 ...