В чем основное отличие между .net Async и google go light weight thread

При вызове runtime.GOMAXPROCS(1) в режиме runtime будет использовать только один поток для всех ваших goroutines. Когда вы делаете io, ваши goroutines выйдут и пусть другие горуты будут работать в одном и том же потоке.

Это похоже на то, как функция .net Async CTP делает совместную concurrency, если вы не используете фоновый поток.

Мой вопрос в том, какое преимущество или недостаток вы могли бы подумать об одном методе над другим.

Ответы

Ответ 1

Создание оценочных суждений всегда сложно, поэтому я выделим 3 отличия. Вы решаете, попадают ли они в ведро "pro" или "con".

  • Хотя и Go, и async позволяют вам писать асинхронный код простым способом, в .NET вы должны знать, какая часть вашего кода является асинхронной, а какая нет (т.е. вы должны явно использовать async/await keywords). В Go вам не нужно знать это - среда выполнения делает ее "просто работающей", нет специального синтаксиса для маркировки асинхронного кода.

  • Дизайн Go не требует специального кода в стандартной библиотеке..NET потребовалось добавить новый код в стандартную библиотеку для каждой операции async, по существу, удваивая поверхность API для этих случаев, например. там новый API загрузки асинхронного HTTP, а старый API-интерфейс без асинхронного HTTP должен оставаться для обратной совместимости.

  • Дизайн и реализация Go на порядок проще. Небольшой кусок кода времени выполнения (планировщик) заботится о приостановке голосовых команд, которые блокируют системные вызовы и уступают спальным goroutines. Нет необходимости в какой-либо специальной поддержке async в стандартной библиотеке.

Для реализации .NET сначала необходимо добавить вышеупомянутые новые API. Кроме того, реализация .NET основана на переписывании кода компилятора с помощью async/await в эквивалентные машины состояний. Это очень умно, но и довольно сложно. Практический результат заключался в том, что первый асинхронный CTP имел известные ошибки, в то время как реализация Go почти полностью работала с самого начала.

В конечном счете, это не имеет большого значения. async/await - лучший способ написать async-код в .NET. Goroutines - лучший способ получить это в Go. Оба они великолепны, особенно по сравнению с альтернативами на большинстве других языков.