V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
winterssy
V2EX  ›  Python

Python 版 mxget 发布~

  •  
  •   winterssy · 2019-11-02 16:34:34 +08:00 · 5344 次点击
    这是一个创建于 1609 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    33 条回复    2019-11-04 16:57:50 +08:00
    dezhou
        1
    dezhou  
       2019-11-02 19:22:29 +08:00 via Android
    蛮好的,
    uhian
        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)]
    winterssy
        3
    winterssy  
    OP
       2019-11-03 00:15:58 +08:00
    @uhian #2 看上去是你本地环境缺少某些根证书
    locoz
        4
    locoz  
       2019-11-03 01:41:39 +08:00
    单纯的 asyncio+aiohttp,性能是没有 Golang+net/http 高的啊...是不是你 Golang 版代码写的有问题
    winterssy
        5
    winterssy  
    OP
       2019-11-03 04:18:23 +08:00 via Android
    @locoz 论单次请求的话,Go net/http 比 aiohttp 快,但为了聚合数据 mxget 经常要发起大量的并发请求,Go 的方案是采用 goroutines+channel,而 aiohttp 则是异步的,这种情况下的性能表现确实优于 net/http
    ipadpro4k
        6
    ipadpro4k  
       2019-11-03 07:07:48 +08:00 via iPhone
    vicnicLight007
        7
    vicnicLight007  
       2019-11-03 09:09:49 +08:00 via iPhone
    mxget 是干嘛的?
    winterssy
        8
    winterssy  
    OP
       2019-11-03 11:47:27 +08:00
    @vicnicLight007 #7 能帮助你从各大音乐平台快速搜索和下载歌曲
    czjackjin
        9
    czjackjin  
       2019-11-03 11:52:46 +08:00 via iPhone
    有机会试试
    jiezhi
        10
    jiezhi  
       2019-11-03 11:55:59 +08:00
    start+fork 了,有没有已经实现了扫描某歌单里灰色歌曲的脚本啊,我要把云音乐里灰色的都传到云盘里
    winterssy
        11
    winterssy  
    OP
       2019-11-03 12:03:29 +08:00
    @jiezhi #10 你说的这个扫描是指返回变灰的歌曲列表吗?
    jiezhi
        12
    jiezhi  
       2019-11-03 12:07:46 +08:00
    @winterssy #11 是的
    zeromake
        13
    zeromake  
       2019-11-03 12:16:11 +08:00
    问个事是什么样的情况下 go 版本,比 py 版本的性能低呢,最近在研究高并发优化,没啥合适的样本。

    是 cli 模式的,还是提供接口的形式?
    uhian
        14
    uhian  
       2019-11-03 12:26:00 +08:00
    @winterssy macOS 10.15 ,也没改过啥……
    winterssy
        15
    winterssy  
    OP
       2019-11-03 12:36:48 +08:00
    @jiezhi #12 这个是可以的,我会写一个独立的脚本(不会并入主体项目)来解决这个问题,写好之后再 @你
    faceair
        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 有啥意义... 你可以试试把这个数往上怼了再测测看
    winterssy
        17
    winterssy  
    OP
       2019-11-03 12:39:46 +08:00
    @faceair #16 这个是测试过的,太高并发会触发某些音乐平台的限制而导致大量的失败请求
    faceair
        18
    faceair  
       2019-11-03 12:44:12 +08:00
    那 golang 性能至少能跑到云平台限制的峰值? python 能超过对端限制峰值?不能的话最多打平手?
    faceair
        19
    faceair  
       2019-11-03 12:45:18 +08:00
    不能把 go 的手脚绑起来说它性能差嘛
    winterssy
        20
    winterssy  
    OP
       2019-11-03 12:55:11 +08:00
    @faceair #19 你没办法知晓平台限制的峰值是多少,不同平台的策略也不一样。二者的限制并发数都是一样的,并没有说 go 性能差,而是说 go 原生的 net/http 库性能确实不是很好,不然也不会有 fasthttp 这样的存在了。这只是我测试的结果,你也可以 clone 源码下来自己跑,如果有 bug,欢迎 pr
    winterssy
        21
    winterssy  
    OP
       2019-11-03 13:11:41 +08:00
    @uhian #14 你使用的命令是?我看看能否复现,有能力的话也可以 clone 源码下来自己调试看看
    uhian
        22
    uhian  
       2019-11-03 13:12:58 +08:00
    @winterssy 我同事没问题,同样的命令。我自己排查下……
    winterssy
        23
    winterssy  
    OP
       2019-11-03 13:17:29 +08:00
    @zeromake #13 mxget 会通过大量的 API 并发请求来聚合音乐标签、歌词、播放地址等数据,这种情况下 goroutines+channel 的方案要比 aiohttp 异步请求稍为逊色,单次请求 /并发下载文件的话,还是 Go 占优的
    blless
        24
    blless  
       2019-11-03 13:25:20 +08:00 via Android
    手机看代码实在不爽 进你的 mxget 随便看了看,util 里面正则 MustCompile 明显可以单独一次初始化就好。
    然后下载保存是放在一个协程里面并发操作,网络并发其实不是越大越好,之前拳头技术博客里面有写一篇下载线程对现在速度影响,8 线程差不多算是最优线程。
    uhian
        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
    blless
        26
    blless  
       2019-11-03 13:27:38 +08:00 via Android
    网络 IO 跟其他 IO 操作混在一起也不算最优吧
    winterssy
        27
    winterssy  
    OP
       2019-11-03 13:36:58 +08:00
    @blless #26 你是指更新音乐标签和下载歌词那块?这个主要是考虑到文件已经下载到本地,而且需要的数据也在内存中,这部分操作是很快的,所以没有另起 goroutine 去处理它,你有更好的实现的话欢迎 pr,感谢~
    winterssy
        28
    winterssy  
    OP
       2019-11-03 13:41:17 +08:00
    @blless #24 嗯正则初始化这个后面会修正,你说的“下载保存是放在一个协程里面并发操作”具体是指?
    winterssy
        29
    winterssy  
    OP
       2019-11-03 15:58:32 +08:00   ❤️ 1
    @jiezhi #12 脚本写好了,在已安装 mxget 的基础上运行该脚本即可获取网易云音乐歌单变灰的歌曲列表,使用前须将歌单临时设为公开。
    脚本地址: https://gist.github.com/winterssy/822d13e79699118c78b442a02f5c4eae
    sugarkeek
        30
    sugarkeek  
       2019-11-03 21:06:18 +08:00
    哈哈哈,没想到是这么接地气的库
    xpresslink
        31
    xpresslink  
       2019-11-04 14:15:46 +08:00
    谢谢分享,star 为敬。
    locoz
        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 的水平,仅此而已。所以我觉得不是网络请求方面拖慢的速度...
    winterssy
        33
    winterssy  
    OP
       2019-11-04 16:57:50 +08:00
    @locoz #32 对的,可能是错觉吧,经过一轮测试我发现 aiohttp 之所以有时比 net/http 稍快是在并发请求上前者对网络的利用率要比后者高
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4729 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 09:46 · PVG 17:46 · LAX 02:46 · JFK 05:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.