English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основы Golang

Условные операторы Golang

Функции и методы Golang

Структуры Golang

Срезы и массивы Golang

Строки (String) Golang

Указатели Golang

Интерфейсы Golang

Конкурентоспособность Golang

Ошибка (Error) Golang

Другие статьи Golang

Конкурентность (Goroutines) в Go

Язык Go предоставляет особую функцию под названием Goroutine. Goroutine этофункцияили метод, могут выполняться независимо и одновременно с любыми другими Goroutine в программе. Иначе говоря, все действия, выполняемые одновременно в Go, называются Goroutine, и вы можете рассматривать 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 заблокировала поток из-за ресурсных требований, все其余 Goroutine будут распределены новому созданному OS потоку. Все эти детали скрыты от программиста.

Анонимная Goroutine

В языке 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
Прощай!! К головной функции