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/m.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燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP