Как сопрограммы улучшают производительность - PullRequest
16 голосов
/ 04 июля 2011

Я видел много разговоров и статей о сопрограммах в python.Они считаются «микропотоками», и я слышал, что они улучшают производительность.

Как сопрограммы улучшают производительность?Из того, что я видел до сих пор, они являются однопоточными и выполняются последовательно.Я согласен, что с точки зрения дизайна они довольно элегантны, особенно в приложениях типа производитель / потребитель.

Думаю, я упускаю суть.Может кто-нибудь помочь объяснить?

Ответы [ 2 ]

10 голосов
/ 04 июля 2011

Сопрограммы на самом деле не улучшают производительность, за исключением очень ограниченного смысла: многопоточные программы имеют определенные накладные расходы, а сопрограммы обеспечивают некоторые преимущества многопоточности без возникновения этих накладных расходов. Однако большинство многопоточных приложений (даже в C-Python с его GIL) получают преимущества от перекрытия, когда один поток блокируется при системном вызове, а другие потоки могут работать: это обычно не происходит с сопрограммами.

Если у вас есть несколько потоков, то обычно перекрывающиеся выигрывают, и сопрограммы не дают выигрыша в производительности. Если вам нужны тысячи потоков, тогда издержки на переключатели потоков будут намного больше, и в этом случае сопрограммы могут дать преимущество, но сокращение числа потоков, вероятно, даст гораздо большее преимущество.

Реальное преимущество сопрограмм заключается в том, что для приложений производителей / потребителей они значительно упрощают кодирование и, следовательно, ускоряют его кодирование.

8 голосов
/ 04 июля 2011

Это хороший вопрос, он напомнил мне Дэвид Бизли Любопытный курс о сопрограммах и параллелизме . Дэвид отлично справляется не только с объяснением того, как сопрограммы работают в Python, но и с примерами использования, когда они действительно в кармане.

Его письмо, кажется, указывает на то, что выигрыш в производительности достигается за счет меньших накладных расходов на выполнение тех же задач, для которых вы обычно используете класс обработчика (см. Слайд 51 из его презентации ).

Так же, как и @ ответ Дункана , можно предположить ситуации, когда накладные расходы имеют значение (например, наличие множества потоков), сопрограммы - это выигрыш в производительности, но сопрограммы - это гораздо больше, чем просто производительность.

...