Python 爬虫并发极限是多少呢?

查看 329|回复 25
v2eeeeee   
并发的时候会考虑 linux 系统设置的 ulimit (max user processes)吗?
还是说网络流的并发都是一个进程 (单线程理解为一个进程) 维护的?
lithbitren   
@black11black 没懂,grequests 用的 gevent 应该和之后的官方协程算另一套体系吧。。
lithbitren   
@black11black grequests 的问题应该是解析数据占用了线程资源导致的效率瓶颈吧
black11black   
@lithbitren 我一直不支持用猴子补丁,我不知道 grequests 的具体实现方式。但是你应该知道多线程是多线程,IO 复用是 IO 复用,你用线程的思考方式考虑 IO 复用是风马牛不相及的两码事。windows 下线程切换的默认时间片是十毫秒还是多少记不住了,linux 应该是几十微秒,基于线程模型理所当然是浪费大部分 IO 性能的,无所谓什么解析数据占用线程资源,就像 select 有监控上限,他不是 py 的并发极限,只是单纯你用了错误的方式而已
lithbitren   
@black11black 不是,不推荐归不推荐,grequests 就是单纯的 gevent+request 的封装,并发爬虫几行写完了就是图个方便,协程是原理,但用 grequests 根本不需要懂协程,而且印象中是 3.5 之前就有了。单独 request 发送回收数据是需要解析时间解析的,从数据返回到数据解析成 request 对象也是需要时间的,是需要占用 GIL 资源的,切协程这个时间在解析数据这里是可以忽略不计的,但最后接收数据的时候阻塞的,如果任意一个请求的响应变慢或超时,整体的统计时间也会大幅增加。
我这里 win10 开线程的应该是不到 1ms 左右,协程应该也是几十微妙。
grequests 的核心代码就是一行 grequests.map(request_list),计时函数只能放在这行代码的前后,实质统计到的是所有请求完整生命周期的时间。
lithbitren   
@black11black 不过我之前说的确实也不对,grequests 的发送时间统计里包括了所有 request 对象的构建,request 发送接受,对返回内容解析几个过程,并不算是实质从第一个对象发出到最后一个对象发出的时间。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部