Python 通过gevent实现协程
2018-03-20 10:39
519 查看
#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对象对协程的并发数量进行了管理,先访问了前两个网址,当其中一个任务完成时才会访问第三个
相关文章推荐
- python3通过gevent.pool限制协程并发数量
- Python并发实践_02_通过yield实现协程
- python协程代理实现有环的协程间消息传递
- python协程io自动切换--gevent
- Python实现基于协程的异步爬虫
- Python通过amqp消息队列协议中的Qpid实现数据通信
- 突破python缺陷,实现几种自定义线程池 以及进程、线程、协程的介绍
- python中的__new__方法与__init__方法区别与调用;通过使用__new__实现单例模式
- 通过python调用adb命令实现用元素名称、id、class定位元素
- python中的协程:greenlet和gevent
- Python实现基于协程的异步爬虫(一)
- 用python通过结巴分词对语料库进行分词初步实现word2vec
- python中的协程:greenlet和gevent
- Python机器学习:通过scikit-learn实现集成算法
- 通过爬虫、lucene和python.web实现网页搜索引擎
- 通过Python模块filecmp 对文件比较的实现方法
- [Python]通过调用百度翻译API实现的翻译小程序
- 通过矩阵求两个向量集中元素两两之间的欧氏距离(python实现)
- 通过矩阵求两个向量集中元素两两之间的欧氏距离(python实现),比直接分开求更快速
- Python 协程实现socket并发