python数据堵塞时要如何处理,数据生产数度大于处理速度
例如:
# -*- coding: utf-8 -*-
import requests
import re
for i in range(5000,5484):
url = 'http://www.meizitu.com/a/'+str(i)+'.html'
headers = {
'User-Agent': 'Mozilla/5.0 (Linux;u;Android 4.2.2;zh-cn;) AppleWebKit/534.46 (KHTML,like Gecko) Version/5.1 Mobile Safari/10600.6.3 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)'
}
r = requests.get(url, headers=headers)
r.encoding = 'gb2312'
par = re.compile('<img alt="(.*?)" src="(.*?)" /><br />', re.S)
items = re.findall(par, r.text)
for item in items:
print item[0], item[1]
down = requests.get(item[1], headers=headers)
with open('img3/%s.jpg' % item[0], 'wb') as f:
f.write(down.content)
for迭代产生的数据 比解析下载的速度快造成堵塞
主要讲讲方法不局限示例代码。
IO操作的话当然速度会慢些。以题主这种网络IO为例,在3.x中最好的解决方案自然是asyncio+aiohttp,requests并不支持异步,aiohttp的client部分的api接口其实和requests也是类似。
对于一种常见的说法:IO(网络,数据库,磁盘)任务使用线程,计算使用进程。做了一些实验,建议是如果不使用异步的话尽量都使用进程。
io操作肯定是要比正常的操作的慢的。
提供一下我的思路,首先我觉得多线程或者多进程不合适。可以将解析和下载抽象为两个方法,两者通过消息队列通信,这就是生产者消费者模型。如果你的的程序小到实现消息队列太复杂,可以先运行解析函数,将解析后的url写入一个文本,数据库或者干脆在内存维护一个列表,完成之后再启动下载函数,从文本,数据库或则列表读取参数。
虽然对python不是很熟,但是也了解过这个问题,让代码异步执行,python也有相应的库的
想让你的下载速度提速一倍吗?如果想的话,就不要再写 requests.get
这种代码了!
使用 requests.Session
预先创建一个 Session 对象,然后请求时使用 Session.get
等方法,对于同服务器的大量下载可提速一倍以上(当然服务器需要支持 Keep-Alive;一般服务器都支持的)。
你并没有遇到任何关于生产比消费快的问题,因为你根本就没有队列!任务根本堆不起来嘛。所以,你应该考虑的是怎么提高下载速度,而不是处理并不存在的「堵塞」。
消息队列可破
你可以使用 celery 来异步处理,把获取的图片都分配给 celery 的 worker 去处理。
解析页面获取图片链接和从图片链接下载图片是两个步骤,可以分开处理,将匹配到的链接都存进redis等内容的队列里面,第一步结束,然后再从队列里面拿链接下载图片,第二部结束
题主能否解释一下【for迭代产生的数据 比解析下载的速度快造成堵塞】这句话?
我觉得多开几个线程可能不一定有效率的优化,但是至少可以解决当前面对的问题。
玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd14137.html
相关文章 Recommend
- • 2019年3月最新消息: Python 3.4.10 现已推出
- • [上海]招Python量化系统开发工程师
- • 优集品网络科技有限公司招Python中/高级工程师
- • 爱因互动科技发展有限公司招募Python开发攻城狮
- • mozio招聘Python/Django工程师
- • Kavout金融科技公司招Python研发工程师
- • Python数组逆向输出,编程练习题实例四十
- • Python数组插入排序,编程练习题实例三十九
- • Python矩阵for循环应用,编程练习题实例三十八
- • Python操作Redis数据库方面的问题
- • 请python高手帮我看看这段python代码中函数setter的
- • Python什么方法可以快速将两个队列变成字典
必知PYTHON教程 Must Know PYTHON Tutorials
- • python 解释器
- • python idle
- • python dir函数
- • python 数据类型
- • python type函数
- • python 字符串
- • python 整型数字
- • python 列表
- • python 元组
- • python 字典
- • python 集合
- • python 变量
- • python print
- • python 函数
- • python 类定义
- • python import
- • python help
- • python open
- • python 异常处理
- • python 注释
- • python continue
- • python pass
- • python return
- • python global
- • python assert
- • python if语句
- • python break
- • python for循环
- • python while循环
- • python else/elif
- • lambda匿名函数
必知PYTHON模块 Must Know PYTHON Modules
- • os 模块
- • sys 模块
- • re 正则表达式
- • time 日期时间
- • pickle 持久化
- • random 随机
- • csv 模块
- • logging 日志
- • socket网络通信
- • json模块
- • urlparse 解析URL
- • urllib 模块
- • urllib2 模块
- • robotparser 解析
- • Cookie 模块
- • smtplib 邮件
- • Base64 编码
- • xmlrpclib客户端
- • string 文本
- • Queue 线程安全
- • math数学计算
- • linecache缓存
- • threading多线程
- • sqlite3数据库
- • gzip压缩解压
最新内容 NEWS
- • django app提供pv信息的方法是什么
- • Django项目版本升级如何操作?
- • django较多数据传递如何优雅的呈现
- • django1.7获取参数问题求助
- • Django1.7使用内置comment遇到问题
- • python mysql数据库做insert操作时报_mysql_ex
- • 关于python mysql的duplicate insert机制的疑问
- • pymongo使用insert函数批量插入被中断要怎么
- • Python程序员解决棘手问题的常用库
- • 求助关于restfull api接口几个问题
图文精华 RECOMMEND
-
django1.7获取参数问题求助
-
Python程序员解决棘手问题的常用库
-
求问str()同__str__原理上有什么不同
-
scrapy框架里面用link extractor怎么能
-
python {}.fromkeys创建字典append添加操
-
python3 类型Type str doesn't support th
热点文章 HOT
- 学习Python有什么好的书籍推荐?
- Python匿名函数 Lambda表达式作用
- Python与Java、C、Ruby、PHP等编程语言有什么
- Python 正则中文网页字符串提取问题
- 如何为实时性应用存取经纬度?django my
- 想用python做个客户端,在二维码登录这个地
- 有让IDE可识别Python函数参数类型的方法吗
- Python字符串转换成列表正则疑问