Python 版 mxget 发布~

2019-11-02 16:34:34 +08:00
 winterssy

很久没写 py 了,于是乎将自己之前用 Go 写的项目 mxget 用 Python 实现了一遍,有了 asyncioaiohttp 加持,性能媲美甚至超越了 Golang 版 mxget 。目前已在 PyPI 发布,大家通过 pip3 install mxget 就能安装并使用了,用法跟 mxget 完全一致。源码: https://github.com/winterssy/pymxget

5383 次点击
所在节点    Python
33 条回复
winterssy
2019-11-03 13:11:41 +08:00
@uhian #14 你使用的命令是?我看看能否复现,有能力的话也可以 clone 源码下来自己调试看看
uhian
2019-11-03 13:12:58 +08:00
@winterssy 我同事没问题,同样的命令。我自己排查下……
winterssy
2019-11-03 13:17:29 +08:00
@zeromake #13 mxget 会通过大量的 API 并发请求来聚合音乐标签、歌词、播放地址等数据,这种情况下 goroutines+channel 的方案要比 aiohttp 异步请求稍为逊色,单次请求 /并发下载文件的话,还是 Go 占优的
blless
2019-11-03 13:25:20 +08:00
手机看代码实在不爽 进你的 mxget 随便看了看,util 里面正则 MustCompile 明显可以单独一次初始化就好。
然后下载保存是放在一个协程里面并发操作,网络并发其实不是越大越好,之前拳头技术博客里面有写一篇下载线程对现在速度影响,8 线程差不多算是最优线程。
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
blless
2019-11-03 13:27:38 +08:00
网络 IO 跟其他 IO 操作混在一起也不算最优吧
winterssy
2019-11-03 13:36:58 +08:00
@blless #26 你是指更新音乐标签和下载歌词那块?这个主要是考虑到文件已经下载到本地,而且需要的数据也在内存中,这部分操作是很快的,所以没有另起 goroutine 去处理它,你有更好的实现的话欢迎 pr,感谢~
winterssy
2019-11-03 13:41:17 +08:00
@blless #24 嗯正则初始化这个后面会修正,你说的“下载保存是放在一个协程里面并发操作”具体是指?
winterssy
2019-11-03 15:58:32 +08:00
@jiezhi #12 脚本写好了,在已安装 mxget 的基础上运行该脚本即可获取网易云音乐歌单变灰的歌曲列表,使用前须将歌单临时设为公开。
脚本地址: https://gist.github.com/winterssy/822d13e79699118c78b442a02f5c4eae
sugarkeek
2019-11-03 21:06:18 +08:00
哈哈哈,没想到是这么接地气的库
xpresslink
2019-11-04 14:15:46 +08:00
谢谢分享,star 为敬。
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 的水平,仅此而已。所以我觉得不是网络请求方面拖慢的速度...
winterssy
2019-11-04 16:57:50 +08:00
@locoz #32 对的,可能是错觉吧,经过一轮测试我发现 aiohttp 之所以有时比 net/http 稍快是在并发请求上前者对网络的利用率要比后者高

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

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

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

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

© 2021 V2EX