2013-02-08 67 views
4

我一直在讀了好幾個小時了,我完全可以想出蟒蛇多線程如何比單線程快。Python和真正的併發線程

真正的問題來自GIL莖。如果有GIL,並且任何時候只有一個線程真的在運行,那麼多線程如何比單個線程更快?

我閱讀了一些操作GIL被釋放(如寫入文件)。這是什麼使多線程更快?

而關於greenlets。這些如何幫助併發?到目前爲止,我所看到的所有目的都是在函數和不太複雜的yield函數之間輕鬆切換。

編輯:怎麼在世界上像旋風一臺服務器可以處理數千個併發連接?

回答

8

你是對的 - 當python等待C代碼執行時,GIL被釋放,這就是你如何獲得一些加速。但是一次只能執行一行python。請注意,這是一個CPython(實現)細節,並不嚴格地說是Python本身的一部分。例如,Jython and IronPython have no GIL and can fully exploit multiprocessor systems

如果您需要在CPython中進行真正的併發編程,您應該查看multiprocessing而不是線程。

+0

+1對於與GIL有關的有用答案。我認爲GIL只對CPU限制的進程很重要。即使存在GIL,IO綁定進程仍然可以從線程(響應等)中獲益。另外,OP詢問了Tornado的性能 - 答案是它使用非阻塞IO,因此不需要事件循環中的線程。 –