許青蛙問了我一個問題:「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


changyy 發表在 痞客邦 PIXNET 留言(0) 人氣()