許青蛙問了我一個問題:「Python 的 list 是不是 thread-safe?」當下我先回顧一下 wiki 上的說法,因為很多東西我都忘了專業名詞 XD 我腦中頂多可以拼湊出 race condition,以及我總覺得 thread-safe 是要跟用法有關 XDD 看來我學習還真的很迷糊,還隨便找了個 deque 呼嚨一下 XDD 最後還是請教了隔壁 team 的 Python 高手。
得知重要訊息:
Python 底部用 bytecode 在執行的,因此可以去確認某個指令是不是一個 bytecode 指令。
而原先許青蛙的問題是在於 list extend 的用法,打算開多個 thread 去新增資料到一個 list 中,接著高手馬上就 demo 給我看:
>>> import dis
>>> dis.dis( "a=[] ; a.extend([])")
0 STORE_GLOBAL 23357 (23357)
3 FOR_ITER 15136 (to 15142)
6 SLICE+2
7 STORE_GLOBAL 25902 (25902)
10 SETUP_LOOP 25972 (to 25985)
13 JUMP_FORWARD 10340 (to 10356)
16 DELETE_NAME 10589 (10589)
>>>
由此可得知 extend 被展開成數行 bytecode ,所以有 race condition 的機會。最後高手也點了我一下,在使用 threading 時可以多作一點設定,細節就請我去看這篇: Understanding Threading in Python。
沒有留言:
張貼留言