Python gevent模块
来源:互联网 发布:拓普康数据转换软件 编辑:程序博客网 时间:2024/05/16 10:59
gevent是第三方库,通过greenlet实现协程,其基本思想是:
当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。
由于切换是在IO操作时自动完成,所以gevent需要修改Python自带的一些标准库,这一过程在启动时通过monkey patch完成:
# -*- coding: utf-8 -*-'''Created on 2016/6/30@author: wwhhff11'''from gevent import monkeyimport geventmonkey.patch_socket()""" 线程数只有1个"""def f(n): for i in range(n): print gevent.getcurrent(), i gevent.sleep(0)g1 = gevent.spawn(f, 5)g2 = gevent.spawn(f, 5)g3 = gevent.spawn(f, 5)g1.join()g2.join()g3.join()
# -*- coding: utf-8 -*-'''Created on 2016/6/30@author: wwhhff11'''from gevent import monkeyimport geventimport urllib2from time import timefrom gevent.pool import Poolfrom gevent.threadpool import ThreadPoolmonkey.patch_all()def f(url): print 'GET: %s' % url respone = urllib2.urlopen(url) data = respone.read() print '%d bytes received from %s.' % (len(data), url)start=time()# 7.55209708214gevent.joinall([gevent.spawn(f,"http://www.qq.com") for i in xrange(100)])# 35.4669699669# for i in xrange(100):# f("http://www.qq.com")end=time()print end-start
# -*- coding: utf-8 -*-'''Created on 2016/6/30@author: wwhhff11'''from gevent import monkeyimport geventimport urllib2from time import timefrom gevent.pool import Poolfrom gevent.threadpool import ThreadPoolfrom gevent.queue import JoinableQueue, Emptyqueue = JoinableQueue()STOP="stop"monkey.patch_all()def html_reader(): while True: try: url=queue.get(0) print 'GET: %s' % url respone = urllib2.urlopen(url) data = respone.read() print '%d bytes received from %s.' % (len(data), url) except Empty: breakstart=time()readers = [gevent.spawn(html_reader) for i in xrange(10)]for i in range(100): queue.put("http://www.qq.com")gevent.joinall(readers)end=time()print end-start
# -*- coding: utf-8 -*-'''Created on 2016/6/30@author: wwhhff11'''from gevent import monkeyimport geventimport urllib2from time import timefrom gevent.pool import Poolfrom gevent.threadpool import ThreadPoolfrom gevent.queue import JoinableQueue, Emptyqueue = JoinableQueue()STOP="stop"monkey.patch_all()def html_reader(): while True: try: url=queue.get(0) print 'GET: %s' % url respone = urllib2.urlopen(url) data = respone.read() print '%d bytes received from %s.' % (len(data), url) except Empty: breakstart=time()pool=ThreadPool(10)for i in range(100): queue.put("http://www.qq.com")for i in xrange(10): pool.spawn(html_reader)pool.join()end=time()print end-start
html_reader个数为1->33s
html_reader个数为10->6s
1
2
3
0 0
- Python gevent模块
- ubuntu12.04.4下安装python模块gevent
- python中的协程模块gevent
- gevent模块
- python gevent
- python-gevent
- python gevent
- python gevent
- python并发编程gevent模块以及猴子补丁学习
- 安装gevent For Python
- python gevent 安装
- python安装gevent
- [python]gevent学习(1)
- python gevent多线程练习
- Python, Gevent and Multicore
- python install gevent
- Python gevent协程
- [python]gevent的安装
- 去掉导航栏下面的一条黑线
- Javascript定义类(class)的三种方法
- 飞机特效粒子效果
- swift-error-this class is not key value coding-compliant for the key sure.'
- printf能输出string型的变量吗?
- Python gevent模块
- 你所不知的 CSS ::before 和 ::after 伪元素用法
- MFC CString 和int相互转化
- CentOS 6.8下编译安装MySQL 5.6.30
- token
- 关于The selected team's agent, '**' must agree to the latest Program License Agreement 的问题
- freemark和bootstrap中页面布局,页签,左右菜单
- leetcode #160 in cpp
- 第一个工程2,-写个简单的测试程序