2011-07-04 36 views
14

我在Python中看到很多關於協程的談話和文章。他們被認爲是「微螺紋」,我聽說他們提高了性能。協程如何提高性能

協程如何提高性能?從我目前看到的,他們是單線程的,並按順序執行。我同意從設計的角度來看,它們非常優雅,特別是在生產者/消費者類型的應用中。

我想我錯過了這一點。有人可以幫忙解釋嗎?

回答

10

除非是非常有限的意義,否則協程並沒有真正提高性能:多線程程序有一定的開銷,並且協程在不產生這些開銷的情況下提供了線程的一些好處。然而,當一個線程阻塞系統調用並且其他線程可以運行時,大多數多線程應用程序(即使在帶有GIL的C-Python中)都會從重疊中受益:這通常不會與協程一起發生。

如果您有幾個線程,那麼通常重疊會勝出,並且協程不會帶來任何性能優勢。如果您需要數千個線程,那麼線程切換開銷將會更大,並且在這種情況下,協程可能會帶來好處,但減少線程數量可能會帶來更多好處。

協程的真正好處在於,對於生產者/消費者應用程序,他們使得編碼變得更簡單,因此編碼更快。

8

這是個好問題,它讓我想起了David Beazley'sA Curious Course on Coroutines and Concurrency。 David不僅在解釋協程在Python中的工作方式方面做得非常出色,而且在用例中他們真的在口袋裏。

他的寫作似乎表明,性能上的好處來自用於完成通常使用處理程序類的相同任務的較少開銷(請參閱his presentation的幻燈片51)。

所以就像@Duncan's answer所暗示的那樣,在開銷很重要的情況下(比如有很多線程),協程是性能上的勝利,但協程不僅僅是性能。