#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. 20155307《网络对抗》Web安全基础实践

    20155307<网络对抗>Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御? 原理:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL ...

  2. mapreduce中控制mapper的数量

    很多文档中描述,Mapper的数量在默认情况下不可直接控制干预,因为Mapper的数量由输入的大小和个数决定.在默认情况下,最终input占据了多少block,就应该启动多少个Mapper.如果输入的 ...

  3. C语言中指针占据内存空间问题

    以前一直有个疑问,指向不同类型的指针到底占用的内存空间是多大呢? 这个问题我多次问过老师,老师的答案是"指向不同类型的指针占据的内存空间大小不同",我一直很之一这个答案,今天我就做 ...

  4. centos 7 jenkins 部署

    安装jenkins 1.拉取库的配置到本地对应文件 sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redha ...

  5. 用信鸽来讲解HTTPS的知识

    加密是一个很难理解的东西,这里头满是数学证明.不过,除非你是在开发一个加密系统,否则无需了解那些高阶的复杂知识. 如果你看这篇文章是为了创造下一个 HTTPS 协议,很抱歉,请出门左走,鸽子是远远不够 ...

  6. Codeforces Round #546 (Div. 2) E - Nastya Hasn't Written a Legend

    这题是一个贼搞人的线段树 线段树维护的是 区间和a[i - j] 首先对于update的位置可以二分查找 其次update时候的lazy比较技巧 比如更新的是 l-r段,增加的是c 那么这段的值为: ...

  7. 利用BFS实现最短路

    首先,我们要知道BFS的思想,BFS全称是Breadth-First-Search. 二叉树的BFS:通过BFS访问,它们的访问顺序是它们到根节点距离从小到大的排序. 图的BFS:同样的,离起点越近, ...

  8. webug4.0安装

    官网:https://www.webug.org/ 官方版本里安装视频教程 4.26 官网打不开,分享当初存在网盘的 链接:https://pan.baidu.com/s/13rG0TLwuA3Ro0 ...

  9. 【Android】Scroller分析

    mScroller.getCurrX() //获取mScroller当前水平滚动的位置 mScroller.getCurrY() //获取mScroller当前竖直滚动的位置 mScroller.ge ...

  10. LeetCode 88. 合并两个有序数组

    题目: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...