为什么基于协程的爬虫要比基于线程的爬虫慢?

2014-12-09 11:03:03 +08:00
 Feiox
实测:
20 个协程 * 1000 个任务 = 23 秒
20 个线程 * 1000 个任务 = 12 秒

10个协程 cpu 占用 2.3%
20 个线程 cpu 占用 56 %

测试代码为最简单 get 网页( with gevent.pool & reqeusts)
5339 次点击
所在节点    Python
21 条回复
felixzhu
2014-12-09 11:21:39 +08:00
切换成本?
phoneli
2014-12-09 11:42:17 +08:00
网络io处理的问题?
imn1
2014-12-09 11:46:40 +08:00
你那个不是乘的关系吧?
12秒 1k任务挺难想象的……爬什么网?
如果只是本地,实际上只是磁盘IO……
est
2014-12-09 11:48:06 +08:00
目测代码姿势奇特。
clino
2014-12-09 11:48:08 +08:00
因为协程只能用一个cpu吧
所以适合与高IO低CPU的任务
wuyadong
2014-12-09 11:48:59 +08:00
requests是阻塞的吧。这样用没有用到协程的效果吧。
clino
2014-12-09 11:50:19 +08:00
是不是因为爬到本地以后要做不少耗CPU的处理导致有这样的结果?
如果有比较耗CPU的动作,看能不能在协程中调用子进程处理,这样就不会因为高CPU阻塞本进程
Feiox
2014-12-09 12:05:10 +08:00
@imn1 学校的网。。。是很慢的。
@wuyadong `requests` 是阻塞的?应该和这个没关系吧。。。确实比单线程块很多。
@clino 没有。纯粹的 get 一个网页
richardtsai
2014-12-09 12:25:27 +08:00
@clino +1

request的阻塞应该可以用gevent.monkey.patch_socket()变成非阻塞~?不过我也没试过……
dant
2014-12-09 12:29:59 +08:00
20 个线程应该完全没有压力啊...
不过 CPython 好像有 GIL?
tabris17
2014-12-09 12:31:41 +08:00
你协程有没有充分利用多CPU资源,协程使用的IO库是不是阻塞的
sujin190
2014-12-09 12:38:44 +08:00
协程不是这么用的
haython
2014-12-09 12:47:03 +08:00
为什么协程会比线程快?
cloverstd
2014-12-09 12:48:00 +08:00
zhouquanbest
2014-12-09 14:04:19 +08:00
为了取得平衡
我一般是多worker(process)+gevent
数量根据业务调配 这样比较方便

(论人手一个Python爬虫轮子的重要性)
clino
2014-12-09 17:00:42 +08:00
楼主用 grequests 试过了吗?
njutree
2014-12-09 17:54:46 +08:00
首先不同语言的协程和线程还是有区别的,其次楼主爬的什么网页io高么,最后使用协程的时候没有让他们有阻塞么?
zenliver
2014-12-10 10:15:31 +08:00
request 阻塞的 无误
wuyadong
2014-12-10 10:38:07 +08:00
@Feiox request是阻塞的,异步的关键是非阻塞的IO。我不是特别清楚gevent是否能将request转成非阻塞IO,但是我觉得有可能这个阻塞IO可能是关键。:)
dishonest
2014-12-26 14:21:22 +08:00
@wuyadong @Feiox gevent 我记得是可以转requests的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/152543

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX