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