很久没写 py 了,于是乎将自己之前用 Go 写的项目 mxget 用 Python 实现了一遍,有了 asyncio
和 aiohttp
加持,性能媲美甚至超越了 Golang 版 mxget
。目前已在 PyPI 发布,大家通过 pip3 install mxget
就能安装并使用了,用法跟 mxget
完全一致。源码: https://github.com/winterssy/pymxget
1
dezhou 2019-11-02 19:22:29 +08:00 via Android
蛮好的,
|
2
uhian 2019-11-02 23:23:24 +08:00
[CRITICAL] get song: Cannot connect to host app.c.nf.migu.cn:443 ssl:default [[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)]
|
4
locoz 2019-11-03 01:41:39 +08:00
单纯的 asyncio+aiohttp,性能是没有 Golang+net/http 高的啊...是不是你 Golang 版代码写的有问题
|
5
winterssy OP @locoz 论单次请求的话,Go net/http 比 aiohttp 快,但为了聚合数据 mxget 经常要发起大量的并发请求,Go 的方案是采用 goroutines+channel,而 aiohttp 则是异步的,这种情况下的性能表现确实优于 net/http
|
6
ipadpro4k 2019-11-03 07:07:48 +08:00 via iPhone
赞
|
7
vicnicLight007 2019-11-03 09:09:49 +08:00 via iPhone
mxget 是干嘛的?
|
8
winterssy OP @vicnicLight007 #7 能帮助你从各大音乐平台快速搜索和下载歌曲
|
9
czjackjin 2019-11-03 11:52:46 +08:00 via iPhone
有机会试试
|
10
jiezhi 2019-11-03 11:55:59 +08:00
start+fork 了,有没有已经实现了扫描某歌单里灰色歌曲的脚本啊,我要把云音乐里灰色的都传到云盘里
|
13
zeromake 2019-11-03 12:16:11 +08:00
问个事是什么样的情况下 go 版本,比 py 版本的性能低呢,最近在研究高并发优化,没啥合适的样本。
是 cli 模式的,还是提供接口的形式? |
16
faceair 2019-11-03 12:36:52 +08:00
golang 版本限制并发到 32 ? https://github.com/winterssy/mxget/blob/master/internal/cli/cli.go#L30
又不是 CPU 密集型任务,限制到核数或者 32 有啥意义... 你可以试试把这个数往上怼了再测测看 |
18
faceair 2019-11-03 12:44:12 +08:00
那 golang 性能至少能跑到云平台限制的峰值? python 能超过对端限制峰值?不能的话最多打平手?
|
19
faceair 2019-11-03 12:45:18 +08:00
不能把 go 的手脚绑起来说它性能差嘛
|
20
winterssy OP @faceair #19 你没办法知晓平台限制的峰值是多少,不同平台的策略也不一样。二者的限制并发数都是一样的,并没有说 go 性能差,而是说 go 原生的 net/http 库性能确实不是很好,不然也不会有 fasthttp 这样的存在了。这只是我测试的结果,你也可以 clone 源码下来自己跑,如果有 bug,欢迎 pr
|
23
winterssy OP @zeromake #13 mxget 会通过大量的 API 并发请求来聚合音乐标签、歌词、播放地址等数据,这种情况下 goroutines+channel 的方案要比 aiohttp 异步请求稍为逊色,单次请求 /并发下载文件的话,还是 Go 占优的
|
24
blless 2019-11-03 13:25:20 +08:00 via Android
手机看代码实在不爽 进你的 mxget 随便看了看,util 里面正则 MustCompile 明显可以单独一次初始化就好。
然后下载保存是放在一个协程里面并发操作,网络并发其实不是越大越好,之前拳头技术博客里面有写一篇下载线程对现在速度影响,8 线程差不多算是最优线程。 |
25
uhian 2019-11-03 13:26:51 +08:00
@winterssy 搜索到了解决方案:
“进入应用程序的 Python 3.6 目录,双击 Install Certificates.command 进行安装,完毕后可以解决该问题。” 参考 url http://blog.yuccn.net/archives/625.html 我看了下就是运行了 pip install --upgrade certifi |
26
blless 2019-11-03 13:27:38 +08:00 via Android
网络 IO 跟其他 IO 操作混在一起也不算最优吧
|
27
winterssy OP @blless #26 你是指更新音乐标签和下载歌词那块?这个主要是考虑到文件已经下载到本地,而且需要的数据也在内存中,这部分操作是很快的,所以没有另起 goroutine 去处理它,你有更好的实现的话欢迎 pr,感谢~
|
29
winterssy OP @jiezhi #12 脚本写好了,在已安装 mxget 的基础上运行该脚本即可获取网易云音乐歌单变灰的歌曲列表,使用前须将歌单临时设为公开。
脚本地址: https://gist.github.com/winterssy/822d13e79699118c78b442a02f5c4eae |
30
sugarkeek 2019-11-03 21:06:18 +08:00
哈哈哈,没想到是这么接地气的库
|
31
xpresslink 2019-11-04 14:15:46 +08:00
谢谢分享,star 为敬。
|
32
locoz 2019-11-04 15:45:09 +08:00
@winterssy #5 我刚刚测试了一下,请求自己服务器上搭建的 httpbin,在确保延时稳定的情况下进行的记录。
Python3.7+aiohttp+aiohttp-requests,无 uvloop,asyncio.gater 并发请求: - 10 个并发 0.276 秒 - 20 个并发 0.381 秒 - 32 个并发 0.412 秒 - 50 个并发 0.607 秒 Golang1.12.5+net/http,goroutines+channel 并发请求: - 10 个并发 0.113 秒 - 20 个并发 0.164 秒 - 32 个并发 0.220 秒 - 50 个并发 0.385 秒 从结果上来看 Golang 确实是不会比 Python 慢的。根据以往的经验来看,Python 加上了 uvloop 之后应该能快个一半左右,也就是接近 Golang 的水平,仅此而已。所以我觉得不是网络请求方面拖慢的速度... |
33
winterssy OP @locoz #32 对的,可能是错觉吧,经过一轮测试我发现 aiohttp 之所以有时比 net/http 稍快是在并发请求上前者对网络的利用率要比后者高
|