作者zerof (猫橘毛发呆雕像)
看板Python
标题Re: [心得] 爬虫实做分享
时间Mon Mar 27 00:29:50 2017
是个练习 asyncio 的好点子(?),只好借来抄一下改成用 aiohttp & aiofiles.
https://github.com/LFLab/aiofetch/blob/master/aiofetch.py
供参
※ 引述《coeric ( )》之铭言:
: 爬了一本旧漫画,顺便做成exe档
: 分享给大家,想请各位给一些意见
: 以单纯一个什麽都不懂,只会点两下的使用者来说
: 是否还有哪里需要改进的?
: http://codepad.org/UZUpas3f
: 附上原始程式码
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.100.76.218
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1490545794.A.A0F.html
1F:推 yinxuanh: 推 03/27 12:39
2F:→ uranusjr: 你跑个 for 回圈里面用 async 根本没意义啊... 03/27 12:42
3F:→ uranusjr: 啊没事我看错惹, 实际做事在 asyncio.wait 03/27 12:43
这疑虑是对的, L:48 的 for-loop 的确会导致 L:54 接近循序执行,在 scheduler
没满的情况下的确会比较慢。
这部份的考量主要在於 L:54 request 的是主网站而非图床,避免大量 requests 导致
其他使用者的延迟。
L:64 则是大量 requests 会导致 WinSock 炸掉....
http://imgur.com/zA94lRJ ,只
好加个 limit 再用 wait() 来跑 。 (它炸太快我也不知道上限到底是多少....)
这里一样的问题是 async.wait() 会 block 到所有的 task done 才跑下一轮,在某种
意义上 scheduler 也是没有满的状态。
PR welcome.
※ 编辑: zerof (192.19.253.250), 03/27/2017 13:26:18
4F:→ s860134: 其实这个例子比较好用 threading 就好,之前 pyCon 有讲 03/27 21:07
5F:→ s860134: 说 requests 在做档案 IO 时好像放掉 GIL? 03/27 21:07
这蛮有趣的XD, requests 下层的 library 是用 urllib3 是 native python 写的,
相依性是零,有 connectionpool ,没猜错的话是用 threading pool 。
而实际上 GIL 在呼叫用 C 写的函式的时候都会被释放,所以在用 open 开档案的时
候是一定会释放 GIL 的。
就算是这样, asyncio 实际上还是比 multithread 快,可以参考这个影片:
https://youtu.be/M8Z65tAl5l4
※ 编辑: zerof (122.100.76.218), 03/27/2017 21:57:58