Python 板


LINE

: 我也可以用 multi-process 而不是 thread 来解啊 : 解法不只一种,而且我不认为问题出在 GIL : 毕竟我的 thread 有三十多个,我也真嫌多了 : 用了 Coroutine 就合并回一个,但却是三十多个 task : 我觉得这也蛮好的 : Coroutine 既然是个潮流就来了解一下,有别的解法就先放一边吧.. : 真要 C 我何不回 C 的世界,写纯 C.. 你要不要看看 Chrome 开起来的时候平常是起几个 Threads ? Coroutine 是潮流? 你不是写 C 吗怎麽没用过 libtask ? 这也难怪前面被呛先回去读 OS , Preemptive/Cooperative multitasking 是不是 都没听过 ? 如果问题不是出在 GIL ,那问题是出在你的 code 架构不对? 我确实是蛮好奇的啦,如果你可以断定不是出在 GIL ,难道 PyQT 的 QThread 是写 来好看的? 我想你从头到尾没有搞清楚 GIL 所以根本不明白 GUI 为什麽会 freezing threading 本身就是 preemptive 的, GIL threads 在 context switching 的时候 会有 Locking 的问题,反过来说, GUI 要执行的 main thread 无法保证总是抢得到 GIL ,而产生 freeze 的现象;当你 threads 开得多,里面又都是跑 python code 的时候就会非常的明显。 Python 连 serial/smbus 的 libraries 都是 blocking I/O ,最底层摸到 sockets 的时候的确是会 release GIL ,但回过头来就还是 preemptive 的本质:你没办法保 证 GUI 用的 thread 一定会抢到 GIL 。 这问题换到用 asyncio 并不会被解决,本质上的差别。 asycnio 底层用的 sockets 是 non-blocking 的,你用同样的 libraries 来跑,一样会遇到 GIL 的问题,而且 更严重。(GUI 一个 loop, asyncio 一个 loop) loop.run_in_executor 的本质是 concurrent.futures 底下的 ThreadPoolExecutor ,当然你也可以改用 ProcessPoolExecutor ,这跟你原本的 threads 改成 Process 一样,唯一的差别是 Executor 用的是 Worker model。 回过头来说,照你原本 30 threads 的版本,可以先试着用 pypy 跑看看能不能加速 Python code 执行的速度,减轻 GIL 的影响 (没错, pypy 也是有 GIL);另外的选 项用 Cython 把 threads 用 release_gil 加速。 上面两个选项都是最小改动,要完全避免 GUI freezing 的话就是把 threads 移到 另一个 Process,变成 Thread(GUI) <-> Process (Threads) 的架构,但如果你在 各个 threads 之间有 sharing data , IPC 的成本不见得会比较低。 当然你也可以写 C 啦,能用的东西多得是,会不会而已。 BTW , asyncio 真的不好吗?当然不是。但 Python 的 async 有传染性,而且受限於 GIL ,sync -> async 不实际, async -> sync 更是自找麻烦。 糯米掺黏米又怎麽会好呢? 要写 GUI 不如左转 nodejs 吧 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 180.218.232.141 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1675706414.A.70D.html
1F:→ leolarrel: 总算有个懂OS/底层的人发文了 02/07 10:39
2F:推 agogoman: 推这篇 02/07 20:47
3F:推 lycantrope: 推 02/07 21:36
4F:推 celestialgod: 推 这篇概念清楚 解释详尽 02/08 20:12
5F:推 Falldog: 推推 02/10 16:30







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP