2017-02-11 3 views
3

Для следующего кода:Является ли процесс тем же, что и Горутин в Голанге?

func main() { 
    goRtns := runtime.NumGoroutine() 
    fmt.Println("goroutines:", goRtns) 
} 

Выход 1. Но это находится в рамках «процесса», без явного вызова goroutines:

«При вычислении процесс представляет собой экземпляр выполняемой компьютерной программы. Он содержит программный код и его текущую активность. операционная система (ОС), процесс может состоять из нескольких потоков выполнения, которые выполняют команды одновременно ».

Кроме того, из отлично «Как goroutines работать» сообщение в блоге Кришной Sundarram: http://blog.nindalf.com/how-goroutines-work/

«Создание goroutine не требует много памяти - только 2kB из стека Они растут путем выделения и освобождения памяти кучи. как требуется."

Мой вопрос в том, что: экземпляр запущенного кода (моя простая функция main.go) подсчитывается как goroutine библиотекой времени выполнения. Можно ли предположить, что родительский процесс рассматривается как подпрограмма go, с теми же правилами распределения памяти, сбора мусора и т. Д.? Было бы разумно предположить, что чтение факта о выполнении goroutine аналогично общему процессу, который его запускает? Что касается второй цитаты на goroutines выше, это звучит как процесс, увеличивающий/сокращающий его пространство стека по мере выполнения программы, которая является стандартной парадигмой в программировании.

Выполняют ли процессы и подпрограммы общие правила? Или я просто что-то пропустил о количестве гориутов.

+1

Просто забудьте о «процессе», это OS/userpace/layman term. В GO все это goroutine, и они запланированы для потоков. Не существует «ходовых процессов» (что бы это ни значило). – Volker

+0

Чтобы немного расширить это, когда вы запускаете программу go, это похоже на выполнение чего-либо еще - это всего лишь один процесс (если программа явно не создает другие процессы). В программе Go всегда есть хотя бы один goroutine (тот, который запускает 'main'). –

ответ

3

Является ли процесс тем же самым, что и Горутин в Голанге?

Вы используете неправильный термин process. В GO все это горутин. как Volker сказал. и вы можете увидеть gouroutine определение из here:

goroutine представляет собой легкий поток управляется выполнения Go.

, например, в коде

func main() { 
    goRtns := runtime.NumGoroutine() 
    fmt.Println("goroutines:", goRtns) 
} 

это имеет только один goroutine, потому что он имеет только main функцию и внутри есть нет go называя здесь. он просто печатает что-то из данной переменной.

другой пример, если вы go называют в функции main:

func main() { 

    result := sq(sq(sq(gen(1, 2, 3, 4)))) 

    numGoroutines := runtime.NumGoroutine() 
    fmt.Println("number goroutine = ", numGoroutines) 

    fmt.Println(<-result) 
    fmt.Println(<-result) 
    fmt.Println(<-result) 
    fmt.Println(<-result) 

} 

вы можете найти кв и ген функции here. Теперь у runtime.NumGoroutine() будет 5 горан. Поскольку внутри функции gen и sq мы имеем go под названием и мы объединим тему здесь общая сумма составит 4 + main конечный результат 5.

2

Вы должны быть осторожны, о процессе термин в Go.Вы указали определение об объектах операционной системы, вызванных процессами, которые будут признаны очень широко. Многие люди поймут это использование.

Но этот термин перегружен. Работа C.A.R. Хоре также имеет значение для нас: в его Коммуникации последовательных процессов (CSP) алгебра, термин процесс относится к чему-то маленькому - гораздо более похоже на сверхлегкую нить. Его алгебра относится к категории математики алгебра процессов.

Так что справедливо предположить, что goroutine является реализация Гоу процесса СНТ .

Go - это как бы более старый язык, Оккам, в этом отношении. В Оккаме процесс означает процесс CSP. Оккам широко использовался для встроенного программирования без гобеля (т.е. без операционной системы), и поэтому не было никакой двусмысленности в отношении термина процесса.

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