2012-03-05 84 views
1

我一直在玩Tornado chat demo。匆匆一瞥,似乎new_messages方法不是線程安全的 - 好像項目可能被添加到waiters陣列中,而for循環中正在迭代相同的陣列。Python Tornado聊天演示應用程序線程安全嗎?

此演示不是線程安全的嗎?或者,它是否是線程安全的,因爲Python set對象本身是線程安全的? Python set對象線程安全嗎?我似乎找到了在這個問題上意見衝突

獎勵積分(和單詞set是demonically很難在谷歌搜索有效!) - 爲什麼是waiters數組在迭代結束設置爲新set代替清空set

回答

6

默認情況下,沒有涉及Tornado應用程序的線程。龍捲風是一個基於事件的系統,所以只有一個執行路徑。你需要弄清楚龍捲風的事情是在什麼時候讓你執行回到IOLoop。

雖然GIL確實能夠抵禦一類線程錯誤,但您仍然可以編寫訪問和修改程序訪問路徑之外的數據的應用程序。

+0

好的,如果你自己運行Tornado(不在Apache或nginx之後),並且在第一個請求仍在執行的過程中另一個請求到達(控制還沒有釋放回IOLoop),那麼第二個請求會發生什麼?它會被拒絕嗎?這就是爲什麼龍捲風通常運行在nginx後面的原因嗎?那麼nginx至少可以排隊第二個請求並在Tornado空閒時發送它? – cailinanne 2012-03-06 11:56:34

+0

這與套接字監聽隊列有關。默認情況下,tornado在開始拒絕連接之前有128個連接的積壓隊列。在nginx或類似版本下運行的原因之一是,由於它是單線程的,如果你有多個CPU,那麼你可以通過運行多個進程來使用機器的全部功能。 – koblas 2012-03-06 14:24:42

+0

非常感謝您的詳細信息! – cailinanne 2012-03-06 18:03:41

-1

它是線程安全的,因爲純Python始終是線程安全的。由於global interpreter lock,一次只能運行一個Python線程。

+4

這不是100%正確的:只要你總是使用原子操作,但是添加到一個集合不是原子的,它只是線程安全的 - 該方法不使用鎖定,它包含幾個指令,所以它可以被中斷,第二個線程可能會嘗試更改導致數據損壞的相同結構。 – 2012-03-06 08:06:59