→ zerof: GUI 的設計原本就是 event-based, 一定會有 callbacks ;你 02/06 13:32
→ zerof: 的問題多到我不知道該從何吐槽,最原始的問題你其實可以左 02/06 13:32
→ zerof: 轉 cython 學一下 release GIL 的用法就不會卡到 GUI (guiz 02/06 13:32
→ zerof: ero 底層是用 tk, written in C) 02/06 13:32
我也可以用 multi-process 而不是 thread 來解啊
解法不只一種,而且我不認為問題出在 GIL
畢竟我的 thread 有三十多個,我也真嫌多了
用了 Coroutine 就合併回一個,但卻是三十多個 task
我覺得這也蠻好的
Coroutine 既然是個潮流就來了解一下,有別的解法就先放一邊吧..
真要 C 我何不回 C 的世界,寫純 C..
推 surimodo: 你python版本用多少 02/06 13:36
3.7, 前一篇有人回我 asyncio.to_thread 這應該是個解,但要 3.9
而它的底層我猜就是 loop.run_in_executo,這應該是同一回事
我目前正在了解 takidog 的邏輯,他那程式是跑起來了
我看能不能擺進 guizero 的 callback 框架裡
await asyncio.gather(job1, job2)
這句可能會出問題,因為真的把 guizero 的例子附上後
我不知要在哪裡 gather 它。。。
我非得拆散他們不可? XD
→ lycantrope: to_thread就是run_in_executor 02/06 14:26
https://paste.ee/p/HzTH3
這是較為完整的例子
包含了程式的退出(之前只為了測試某些目的,程式有 bug 無法結束都不管)
結果我還是只能用 polling 寫出來
因為我無法把該 gather 在一起的東西拆開!
至於全域變數的使用,傳送。。。
暴力點,用 class 就好 XD
我也試過把整個 main 宣告為 async,讓它當我 Coroutine 的根部
但是失敗了
※ 編輯: HuangJC (123.204.157.162 臺灣), 02/06/2023 16:13:45
→ poototo: 以上連結是使用兩種condition 02/06 23:32
→ poototo: asyncio.condition是基於asyncio.event 02/06 23:33
→ poototo: asynio.notify跨緒僅可解鎖及廣播同eventloop的waiter 02/06 23:36
推 poototo: loop向下對task,向上對thread,越級對其他loop的task 02/06 23:53
→ poototo: 我不確定可行性,但異步管理弄太複雜我寧願犧牲效能... 02/06 23:55
我就是這樣做,但你這個例子也無法搬至 guizero 上
我前面有想搬 TakiDog 的例子,但發現無法找到 gather 的點
搬至 guizero 後我是要做到 UI 互動
也就是 task 1 要是個 loop 不斷跑
而 sync func 是由螢幕上的按鍵經使用者互動,guizero 會 callback
每 callback 一次,task 1 的 loop 就解鎖 condition 跑一次 do 1, do2, .....
你的例子,t_cond 不在 task1a 裡,所以 task1a 不是早就執行起來等
也不會是每經 t_cond callback 一次,task1a 就繞一次
稍微改一下就是我後來的解法了
推 OnoderaHaru: 反正最後還是包裝成執行緒,直接用執行緒可以用的來 02/07 01:04
→ OnoderaHaru: 溝通 02/07 01:04
https://paste.ee/p/OxGNI
這會有問題
我把 reportTask 再進一步弄成 reportTask1, reportTask2
其中 reportTask2 就是無腦一直 looping
運作良好
然後把 self.q.get() 那行 unmark 就會發現問題
threading 的 queue (或任何同步物件)
它是阻塞一整個 queue
因為所有的 task 事實上是同一個 thread,所以一個塞住其他就塞住了
這就是要改用 asyny 版本的 queue 的原因
任何的阻塞,不管是 condition, lock, sleep
只要是 async 版本的,就能把執行權轉移到其他 task 上去
這樣使用 Coroutine 的 task 才有意義
其實我在前面的討論裡都有提及這些,只是文筆不好,無法讓大家理解這個意思
但現在這篇應該能解釋了(我回去修文改成紅色的部份)
這個可以 XD
那我就是想法子利用這個 queue 去湊架構了...
剛草草看了底層 source code
不很清楚它怎麼做到 sync async 轉換的
----
這一面貼兩個程式我不會,是不是因為我沒註冊 XD
※ 編輯: HuangJC (1.168.18.180 臺灣), 02/08/2023 13:38:59
※ 編輯: HuangJC (116.241.233.114 臺灣), 03/04/2023 03:36:10