English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Язык Go предоставляет особую функцию под названием Goroutine. Goroutine этофункцияили метод, могут выполняться независимо и одновременно с любыми другими Goroutine в программе. Иначе говоря, все действия, выполняемые одновременно в Go, называются Goroutine, и вы можете рассматривать Goroutine как легковесные потоки. По сравнению с потоками, создание Goroutine стоит очень недорого. Каждый программ имеет по крайней мере один Goroutine, который называетсяОсновной GoroutineЕсли основной Goroutine завершается, то все Goroutine, выполняющиеся под ним, также завершаются; Goroutine всегда работают в фоновом режиме.
Вы можете использовать ключевое слово go в качестве префикса перед вызовом функции или метода, чтобы создать свою own Goroutine, как показано в следующей грамматике:
Синтаксис:
func name(){ // Строка } // Использование ключевого слова go перед именем функции go name()
package main import "fmt" func display(str string) { for w := 0; w < 6; w++ { fmt.Println(str) } } func main() { // Вызов Goroutine go display("Добро пожаловать") //Нормальный вызов функции display("oldtoolbag.com") }
Вывод:
oldtoolbag.com oldtoolbag.com oldtoolbag.com oldtoolbag.com oldtoolbag.com oldtoolbag.com
В上面的 примере мы создали толькоdisplay()Функция, затем вызов этой функции двумя различными способами, одним из которых является Goroutine, то есть go display("Welcome"), а другим является обычный вызов функции, то есть display("w3codebox")
Но вы, возможно, заметили проблему, она показывает только результат вызова обычной функции, но не结果显示 Goroutine, потому что при выполнении нового Goroutine вызов Goroutine немедленно возвращается. Это не так, как обычная функция, которая ждет завершения Goroutine. Они всегда продолжают идти до следующей строки после вызова Goroutine и игнорируют возвращаемое значение Goroutine. Поэтому, чтобы правильно выполнить Goroutine, мы внесли некоторые изменения в программу, как показано в следующем коде:
Пример Goroutine после изменений:
package main import ( "fmt" "time" ) func display(str string) { for w := 0; w < 6; w++ { time.Sleep(1 * time.Second) fmt.Println(str) } } func main() { // Вызов Goroutine go display("Добро пожаловать") //Звонок обычной функции display("w3codebox") }
Вывод:
Добро пожаловать w3codebox w3codebox Добро пожаловать Добро пожаловать w3codebox w3codebox Добро пожаловать Добро пожаловать w3codebox w3codebox
Мы добавили метод Sleep() в нашу программу, который заставляет главный Goroutine спать 1 секунду между выполнением нового Goroutine, чтобы на экране отображалось приветствие, и затем 1-секундный главный Goroutine перераспределяется и выполняет свои действия, после чего процесс продолжается до тех пор, пока значение z < 6, после чего главный Goroutine завершает работу. В этом процессе Goroutine и обычные функции работают одновременно.
Goroutine имеют меньший объем затрат по сравнению с потоками.
Goroutine хранятся в стеке, и размер стека может увеличиваться и уменьшаться в зависимости от требований программы. Но в потоке размер стека фиксирован.
Goroutine могут общаться через каналы, и эти каналы спроектированы так, чтобы предотвращать ситуации конфликта при доступе к общему памяти при использовании Goroutine.
Предположим, что у программы есть один поток, и у него много связанных с ним Goroutine. Если любая Goroutine заблокировала поток из-за ресурсных требований, все其余 Goroutine будут распределены новому созданному OS потоку. Все эти детали скрыты от программиста.
В языке Go вы также можете запустить Goroutine для анонимной функции, иными словами, вы можете просто использовать ключевое слово go в качестве префикса перед этой функцией, как показано в следующем синтаксисе:
Синтаксис:
//Звонок анонимной функции go func(параметр_списка){ // Строка }(аргументы)
package main import ( "fmt" "time" ) func main() { fmt.Println("Добро пожаловать!! на головную функцию") //Создание анонимной Goroutine go func() { fmt.Println("Добро пожаловать!! на oldtoolbag.com") }() time.Sleep(1 * time.Second) fmt.Println("Прощай!! К головной функции") }
Вывод:
Добро пожаловать!! на головную функцию Добро пожаловать!! на oldtoolbag.com Прощай!! К головной функции