2016-12-02 2 views
-2

Почему нет операции .join (т. Е. Блокировать до конца) на гортанах? Вместо того, чтобы использовать каналы для общения, когда нужно действовать в главной горутине?Почему на goroutines нет операции `.join`?

Похоже, что у меня нет чего-то фундаментального в теории вокруг CSP.

EDIT: Я спрашиваю «почему это так», а не «как мне сделать это».

+0

Вы видели ['sync'] (https://golang.org/pkg/sync/)? У него есть примитивы для ожидания окончания потока (хотя, как я понимаю, это не самый предпочтительный способ работы в Голанге). – Jules

+0

Нет, нет. Но в любом случае, я задаю вопрос * почему *, а не * как *. – Tobias

+0

Это сделало бы ваш вопрос спорным, если есть способ сделать это. – Jules

ответ

1

Это просто потому, что goroutines - это не темы. Данную goroutine можно планировать с помощью среды выполнения Go, связанной с потоком операционной системы, но, например, в случае блокировки операций ввода-вывода указанные потоки могут быть связаны с другими goroutines, в то время как другой ожидает.

Что это значит?

Для соединения с потоком требуется синхронизирующий объект, чтобы узнать, когда поток завершен. Поскольку Go's goroutines на самом деле просто очень легкие объекты, которые имеют только стек, они не предоставляют такие объекты синхронизации напрямую.

Предложение Go's CSP заключается в том, что вы можете дезинтегрировать тысячи goroutines очень дешево и использовать столько потоков, сколько у вас есть физические ядра процессора. В перспективе ОС объекты синхронизации дороги, поэтому наличие таких объектов для каждого горутина будет очень неэффективным.

Вместо этого синхронизация достигается с использованием каналов или WaitGroup из пакета синхронизации.

+1

Спасибо за это. Я приму это в качестве ответа. (Не могу поверить, что я спустился - проголосовал 6 раз людьми, которые, вероятно, даже не знают этого.) – Tobias

+0

Это, на мой взгляд, вполне приемлемый и законный вопрос, который подчеркивает фундаментальный аспект языка :) – SirDarius

+2

Я бы сказал что он не имеет ничего общего с тем, что goroutines не является потоком, он уходит корнями в то, что это был выбор дизайна, чтобы сделать goroutines не идентифицируемым или адресуемым. Время выполнения теоретически может обеспечить объединение, поскольку оно может определять, когда возвращается goroutine, но вы не можете «присоединиться» к чему-то, к которому вы не можете получить ссылку. – JimB

Смежные вопросы