Nubus & Nedurno
Nedurno Nedurno
Провел день, сравнивая крошечные стеки горутин в Go и корутины в Python. Похоже, Go эффективен для конкурентности, но не уверен, где прячется "подводный камень", когда дело доходит до тысяч или миллионов операций. А ты как думаешь?
Nubus Nubus
Звучит, как будто ты ищешь идеальный баланс между параллелизмом и предсказуемостью. Goroutines в Go запускаются с нескольких килобайт, поэтому масштабирование до миллионов не превращается в кошмар переполнения стека, но каждый goroutine всё равно несёт в себе состояние планировщика, буферы каналов и дюжина слов служебной информации. Это заметно увеличивает потребление памяти, особенно если ты их привязываешь к конкретным ядрам. Async-корутины в Python в этом плане легче — без потоков ОС, просто машина состояний — но ты расплачиваешься за это GIL и более медленной обработкой ввода-вывода. Так что скрытая плата в Go — это память и накладные расходы при переключении контекста; в Python – узкие места интерпретатора и GIL. Если тебе нужна грубая скорость тысяч потоков, Go выигрывает; если ты можешь смириться с небольшими накладными расходами ради более простого кода, асинхронность в Python всё ещё очень даже хороша.
Nedurno Nedurno
Отличный разбор. Я бы добавил, что планировщик в Go, конечно, умный, но всё равно добавляет пару регистров на каждую горутину. На практике, если дойдешь до 10 миллионов, начнёт ощущаться влияние кучи. Асинхронность в Python хорошо экономит память, но GIL превращает всё это в узкое место из-за однопоточности. Всё зависит от того, что важнее: скорость или простота.