Параллельное программирование.
В поддержке параллельного программирования Python существенно уступает Go. Прежде всего, GIL в Python является препятствием для эффективного использования систем с большим числом (десятки и более) физических процессорных ядер. Другой проблемой является отсутствие эффективных встроенных средств взаимодействия параллельных потоков. Go содержит языковой примитив goroutine, позволяющий создавать «легковесные» потоки, и поддерживаемые на уровне синтаксиса каналы, обеспечивающие взаимодействие потоков. В результате при создании, например, систем массового обслуживания на Go не составляет проблемы использование сотен и даже тысяч одновременно существующих потоков, причём с обеспечением нормальной загрузки любого количества доступных процессорных ядер, тогда как ни одна из существующих реализаций Python эффективную работу такого количества потоков не обеспечит.
Обработка ошибок, исключения.
Python поддерживает обработку исключений, тогда как Go реализует механизмы явного возврата кодов ошибок из функций и обработки их в месте вызова. Оценка этого различия может быть разной. С одной стороны, исключения являются удобным и привычным механизмом обработки программных ошибок, позволяющим сосредоточить эту обработку в выделенных фрагментах кода, а не «размазывать» её по всему тексту программы. С другой стороны, авторы Go считают, что программисты слишком часто игнорируют обработку ошибок, полагаясь на то, что возникшее исключение будет обработано в другом месте; в распределённых приложениях исключения часто не передаются между компонентами системы и приводят к неожиданным отказам, а в многопоточных приложениях необработанное исключение в потоке может привести к блокировке или, наоборот, к краху программы.
Изобразительные возможности, синтаксис.
Python предоставляет большее число удобных для быстрой разработки языковых возможностей и примитивов, чем Go. Во многом это связано с тем, что разработчики Go сознательно отказались от включения в язык некоторых «модных» средств, одни из которых сочли провоцирующими ошибки, другие — маскирующими заведомо неэффективную реализацию. Например, наличие в языке простой операции вставки элемента в середину массива провоцирует на её частое использование, а каждая такая операция требует, как минимум, перемещения «хвоста» массива в памяти, а иногда может требовать выделения памяти и перемещения всего массива.
Do'stlaringiz bilan baham: |