[問題] 如何讓thread競爭公平一點

看板Python作者 (chaney)時間8年前發表 (2017/05/07 15:40), 8年前編輯推噓3(3012)
留言15則, 7人參與, 最新討論串1/1
作業要用thread做一個類似心臟病的遊戲 每個玩家手上會有一些牌 如果玩家手中的牌花色或數字一樣就會進行強牌的動作 搶到牌後就捨棄掉配對的牌 如果所以玩家沒有相同花色或數字則會進行偷牌的動作 偷到的牌會加入手牌中 遊戲是做出來了 但是總是會有一人持續掌權一陣子才換人(也就是連續搶/偷牌) 如果加上延遲(time.sleep),又會變成輪流每個人一個動作 請問我該怎麼做避免同個人一直搶牌呢(或是公平一些)? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.110.31.250 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1494171602.A.5E0.html

05/08 01:21, , 1F
用lock 看誰先acquire呢
05/08 01:21, 1F

05/08 02:58, , 2F
我是把acquire放在迴圈裡,所以當Lock的時候,其他threa
05/08 02:58, 2F

05/08 03:00, , 3F
d會在迴圈空轉直到有thread release,可是當A thread re
05/08 03:00, 3F

05/08 03:00, , 4F
lease 時有非常高的機會再度搶到lock
05/08 03:00, 4F

05/08 04:59, , 5F
Use priority
05/08 04:59, 5F

05/08 05:21, , 6F
你有考慮到 Python 的 GIL 嗎?這種情況下應該做不出你
05/08 05:21, 6F
爬了一下GIL的問題,所以只能自己設定每個thread的priority來解決囉?

05/08 05:21, , 7F
想像中的 multithread 的情況喔
05/08 05:21, 7F

05/08 09:54, , 8F
乾脆你自己隨機分配現在該執行的是哪個thread
05/08 09:54, 8F
是有想過如果同個玩家連續搶到三次就不讓他搶下一次啦…

05/08 10:30, , 9F
code?
05/08 10:30, 9F
這是run裡面的 while len(self.cards) != 0 and not GAMEOVER: threadLock.acquire() if match_card(self.cards): # 強牌 elif STEAL: # 偷牌 print_all_players_card() # 會更新下一張牌,並確認是否可以STEAL threadLock.release() ※ 編輯: ymps3502 (111.80.114.99), 05/08/2017 10:59:40 ※ 編輯: ymps3502 (223.143.103.77), 05/08/2017 11:21:21

05/08 12:31, , 10F
...Lock 要共用才是對的
05/08 12:31, 10F

05/08 12:31, , 11F
05/08 12:31, 11F
阿,不好意思,我想說為了閱讀方便所以寫成threading.Lock(),實際上有在外面宣告threadLock = threading.Lock(),上面的code我修正過了 ※ 編輯: ymps3502 (140.120.15.137), 05/08/2017 13:52:50

05/08 14:06, , 12F
....所以是每個 threading 各跑一個 while without IO?
05/08 14:06, 12F
是的

05/08 15:24, , 13F
random延遲?
05/08 15:24, 13F
※ 編輯: ymps3502 (140.120.15.137), 05/08/2017 15:42:46

05/08 15:46, , 14F
那沒用, lock 前 print(end="") or sleep(random()/1000)之
05/08 15:46, 14F

05/08 15:46, , 15F
類的吧, 後者會比較明顯一點
05/08 15:46, 15F
感謝各位,使用random有明顯改善了! ※ 編輯: ymps3502 (140.120.15.137), 05/08/2017 15:54:33
文章代碼(AID): #1P3p_INW (Python)