2015-01-05 3 views
0

В учебниках и документации, которые я прочитал, все говорят, что goroutines - это «не совсем потоки» или «легкие потоки», но обычно их можно рассматривать как их собственный отдельный поток.Что такое goroutines?

Итак ... Что они на самом деле?

+0

Прочтите реализацию? –

+0

Где я могу найти реализацию по встроенным ключевым словам? –

+1

http://dave.cheney.net/2014/06/07/five-things-that-make-go-fast может помочь. – VonC

ответ

0

При наличии двух процессоров goroutine (s) работает как реальные потоки. При наличии единого процессора goroutine (s) выполняется как совместная процедура одного потока, который работает с переключением их контекстов. goroutine не прикрепляет фиксированную нить. Таким образом, это не идентификатор типа thread-id. Если вы хотите вставить goroutine в качестве потока ОС, вам нужно использовать runtime.LockOSThread().

3

Несколько вещей отличают goroutines от типичных потоков ОС:

  • Там в планированиипользовательского режима. Когда goroutine заблокирован (ожидание в сети, скажем), Run runtime ищет другой, который может работать. Это происходит без необходимости ввода и выхода из режима ядра и без запуска планировщика ядра ОС.
  • Только Планирование пользовательского режима: для использования нескольких ядер Go запускает несколько потоков ОС и запускает goroutines на всех них, потенциально перемещая goroutine между потоками ОС, чтобы все было занято. Если вы слышите, что goroutines «мультиплексируются» на потоки ОС, это то, что это значит.
  • Они предназначены для низкой стоимости для начала. Стеки начинаются с малого, всего в несколько килобайт и растут по мере необходимости, независимо от того, использует ли ОС виртуальную память или нет.
  • Они привязаны к языку; кроме самого заявления go, есть channel types и операции и select statements для координации горутов.
  • Они отсутствуют некоторые функции потоковой обработки ОС: в настоящее время планировщик Go не гарантирует справедливости, и существует только очень ограниченное предубеждение (пустая петля for{} никогда не будет отключена).

Они тесно связаны с большим количеством других терминов:

  • fibers, термин, используемым в связи с пользовательским режимом запланированных потоками
  • green threads другой термином, используемым для обозначения на заданный пользователь режим запланированной темы
  • coroutines, ссылаясь на процедуры, которые могут дать контроль друг с другом в произвольных точках в коде
  • event-driven architectures, whic h может переключиться на другие задачи, ожидая при асинхронных событиях, таких как сетевой ввод-вывод, но не может представлять собой поточно-ориентированный интерфейс (например, они могут использовать функции обратного вызова)
  • M:N hybrid threading, в котором используются как ядра, и может включать миграцию потоков пользовательского режима в потоках ОС.
0

This Morsing's blog post about the Go scheduler приятно, потому что у него есть изображения с треугольниками, квадратами и кругами.

С точки зрения планировщика зрения:

goroutine включает в стек, указатель команд и другую информацию, важную для планирования.