#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. 【LeetCode9】Palindrome Number★

    题目描述: 解题思路: 求回文数,并且要求不能使用额外的空间.思路很简单,算出x的倒置数reverse,比较reverse是否和x相等就行了. Java代码: public class LeetCod ...

  2. Android APK 签名比对(转)

    Android apk签名的过程 1. 生成MANIFEST.MF文件: 程序遍历update.apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个生成SHA1的数字签名信息,再用Ba ...

  3. tf tensor 输出

    在学习TensorFlow的过程中,我们需要知道某个tensor的值是什么,这个很重要,尤其是在debug的时候.也许你会说,这个很容易啊,直接print就可以了.其实不然,print只能打印输出sh ...

  4. 按键精灵对APP自动化测试(上)

    简单介绍下应用背景:测试安卓app时发现重复点击某一按钮的时候会出现报错,开发修复后提交测试.如果采用手动点击按钮,效率不高,在领导提示下使用按键精灵实现自动操作. 一.       安卓手机按键精灵 ...

  5. win10安装tensorflow-gpu

    1.安装anaconda (最好使用清华源下载) 2.打开cmd conda create -n tensorflow pip python=3.6 activate tensorflow pip i ...

  6. 论文阅读 | Clustrophile 2: Guided Visual Clustering Analysis

    论文地址 论文视频 左侧边栏可以导入数据,或者打开以及前保存的结果.右侧显示了所有的日志,可以轻松回到之前的状态,视图的主区域上半部分是数据,下半部分是聚类视图. INTRODUCTION 数据聚类对 ...

  7. Vulkan入门流程

    原文摘自Vulkan入门流程 Vulkan是Khronos Group(OpenGL标准的维护组织)开发的一个新API,它提供了对现代显卡的一个更好的抽象,与OpenGL和Direct3D等现有api ...

  8. 【阿里巴巴】CBU技术部招聘

    如果你偏爱技术挑战,希望成就不一样的自己,欢迎投递简历至 yangyang.xiayy@alibaba-inc.com [业务简介] B2B内贸www.1688.com:1688.com是最大的内贸B ...

  9. java入门--4110:圣诞老人的礼物-Santa Clau’s Gifts

    学习了一下java的语法,就用poj上的题目做作练习,好更快的熟悉常用的java语法. 题目在这里 http://bailian.openjudge.cn/practice/4110/ import ...

  10. 使用Jekyll在Github上搭建个人博客 - 环境搭建

    本地安装Jekyll 首先安装Ruby及gem Ruby的安装 Ruby官网进行下载 从RubyInstaller下载ruby [新手推荐] 我采用的是RubyInstaller,无脑简单 勾选时我配 ...