4

В документации Golang как-то неясно раскрывается суть goroutines. Скажите, goroutines - это ничто иное как потоки операционной системы? (т.е. как я пониманию, компилятор Go сам заботится о внутренней реализации этих потоков в зависимости от операционной системы)

Jeremy
  • 136

3 Answers3

5

по простому - это более высокоуровневые потоки. К примеру, если нужно выполнять очень мелкие действия в отдельных потоках, то обычные потоки будут накладными - система будет дольше их создавать. для goroutines run-time может переиспользовать один и тот же поток, эмулируя работу настоящих потоков. В результате получается быстро и дешево. Проблема номер два - некоторые процессы могут создавать очень большое количество потоков (например, из за ошибки программиста). goroutines такого не должно случиться - они будут прост в очереди.

Можно считать, что goroutines - это такой встроенный в язык thread pool.

KoVadim
  • 112,121
  • 6
  • 94
  • 160
  • Не ясно совершенно. Что значит эмуляция потоков? В документации ясно говориться, что если goroutine "зависает" блокирующей io-операцией, то это никак не сказывается на другие потоки. Но если процесс всего один и псевдопотоки это суть один процесс, то как это все решается? – Jeremy Jun 21 '13 at 14:10
  • ну пусть себе зависает, кто мешает? есть технологии, которые это позволяют обработать. К примеру (это я фантазирую, просто предполагаю, как я бы это сделал!), когда горутине нужно сделать i/o, то она останавливается (при этом она тратит немного памяти), а сам запрос обрабатывается асинхронно run-time'ом. Когда данные придут, горутине выделяются новый поток или тот же + данные, и она продолжает работать. Так как за этот период горутина не работала, то она не мешала другим. Ожидание легко делаются на select/poll/другая технология. В принципе, ОС это и сама делает. – KoVadim Jun 21 '13 at 14:28
  • Что подразумевается под run-time'ом в данном случае? Отдельный поток операционной системы? – Jeremy Jun 21 '13 at 15:06
  • 1
    run-time - это набор функций, которые вставляет компилятор, чтобы обеспечить работу программы. Он может быть как внутри exe файла (Delphi), так и отдельными (Builder), так и целыми сложными системами с кучей dll и exe. Он может и создавать потоки (как в Java для GC), и по сети с другими компами связываться. Это личное дело run-time.

    В случае Go я думаю, что он создает несколько потоков, по которым раскидывает goroutines. Но может и не создавать. Например, если это горутина, которая просто складывает два числа.

    – KoVadim Jun 21 '13 at 19:14
0

Если бы это была бы просто параллельность средствами операционной системы, то не следовало бы и язык городить. Другие языки для этих целей прекрасно обходятся библиотеками.

ГоРутины - это сильно кастрированные потоки, если сравнивать их с теми, что предоставляет нам операционная система, нет особых гарантий параллельности, некоторые особо рьяно работающие ГоРутины могут заблокировать своей активностью другие ГоРутины.

Но при этом, как верно заметили выше, они очень не накладны и на этапе разработки программы и на этапе выполнения программы.

Наиболее близкий аналог - green threads

Softa
  • 599
-2

Наиболее близкий аналог - green threads

Да вот не похоже что так. green threads 100%-блокируется на i/o

  • Наиболее близкий аналог горутин — async/await из C#. – VladD Aug 10 '15 at 10:53
  • Постарайтесь писать более развернутые ответы. Поясните, на чем основано ваше утверждение? – Nicolas Chabanovsky Aug 10 '15 at 15:03