Это 21-я статья из серии «Изучаем язык го».
Параллелизм и параллелизм
Когда дело доходит до параллелизма, я думаю, вы слышали о другом понятии — параллелизме. Позвольте мне сначала представить разницу между ними, а затем поговорить о параллелизме языка Go.
параллельноНа самом деле нетрудно понять, что это значит выполнять одновременно и иметь возможность выполнять несколько задач в определенный момент времени. Самый простой способ добиться параллелизма — использовать многопоточность или многопроцессорность, чтобы несколько задач могли выполняться одновременно. Один поток никогда не сможет достичь параллелизма.параллелизмВозможна обработка нескольких задач одновременно в течение определенного периода времени. Обычно мы говорим, что программа предназначена для одновременной работы, то есть она позволяет выполнять несколько задач одновременно, что является периодом времени. Несколько задач в одном потоке выполняются с интервалами для достижения параллелизма. Можно сказать,Многопоточность или многопроцессорность — основа параллелизма, но однопоточность также обеспечивает параллелизм с помощью сопрограмм.
Для общего примера, одноядерный компьютер может загружать и слушать музыку.На самом деле эти две задачи выполняются таким образом, но время переключения между этими двумя задачами короткое, что создает впечатление, что они выполняются в одно и то же время. то же время.
Выполнение задачи многоядерного компьютера показано на следующей схеме:Как видите, одновременно можно выполнять несколько задач. Такой способ выполнения задач и есть настоящий параллелизм.Go реализует параллелизм через сопрограммы, а связь между сопрограммами опирается на каналы.В этой статье сначала рассказывается об использовании сопрограмм, а затем описываются каналы.
сопрограмма
Сопрограмму (Goroutine) можно рассматривать как легковесный поток, но его накладные расходы очень малы по сравнению с потоком. Поэтому приложения Go часто могут одновременно запускать тысячи сопрограмм. Go Создать сопрограмму так же просто, как добавить ключевое слово go перед вызовом метода или функции.
func printHello() {
fmt.Println("hello world goroutine")
}
func main() {
go printHello() // 创建了协程
fmt.Println("main goroutine")
}
вывод:
main goroutine
Приведенный выше код, строка 6 создает сопрограмму с использованием ключевого слова go, и теперь есть две сопрограммы, только что созданная сопрограмма и основная сопрограмма. Функция printHello() будет выполняться одновременно независимо от основной сопрограммы. Да, вы правильно прочитали, вывод программы такой, вы не верите? Вы действительно можете запустить программу. Вы удивлены, почему нет вывода из функции printHello(), что происходит?Когда сопрограмма создана, основная функция немедленно возвращается, чтобы продолжить выполнение следующей строки кода, в отличие от вызова функции, который должен дождаться завершения функции.. После выполнения основной сопрограммы программа завершает работу, и сопрограмма printHello также завершает работу, и вывода нет.
Измените следующий код:
func printHello() {
fmt.Println("hello world goroutine")
}
func main() {
go printHello()
time.Sleep(1*time.Second)
fmt.Println("main goroutine")
}
После создания сопрограммы основная сопрограмма сначала спит на 1 секунду, что зарезервировано на время выполнения сопрограммы printHello, поэтому на этот раз вывод:
hello world goroutine
main goroutine
Создайте несколько сопрограмм
Как упоминалось в предыдущем разделе, вы можете создать несколько сопрограмм.Давайте рассмотрим следующий пример:
func printNum() {
for i := 1; i <= 5; i++ {
time.Sleep(20 * time.Millisecond)
fmt.Printf("%d ", i)
}
}
func printChacter() {
for i := 'a'; i <= 'e'; i++ {
time.Sleep(40 * time.Millisecond)
fmt.Printf("%c ", i)
}
}
func main() {
go printNum()
go printChacter()
time.Sleep(3*time.Second)
fmt.Println("main terminated")
}
В приведенном выше коде в дополнение к основной сопрограмме создаются две новые сопрограммы: сопрограмма printNum и сопрограмма printChacter. Сопрограмма printNum выводит 5 чисел каждые 20 миллисекунд, а сопрограмма printChacter выводит буквы каждые 40 миллисекунд. После того, как основная сопрограмма создаст эти две сопрограммы, она приостанавливается на 1 с и ожидает завершения выполнения других сопрограмм. Вывод программы (ваш вывод может не совпадать с моим):
1 a 2 3 b 4 5 c d e main terminated
При этом ждать завершения выполнения сопрограммы путем добавления функции time.Sleep() — это «черная технология». В реальной производственной среде, независимо от того, знаем ли мы, сколько времени требуется для завершения других сопрограмм, мы не можем добавлять случайные вызовы сна к основной сопрограмме, чтобы дождаться завершения других сопрограмм. Что делать тогда? Go предоставляет нам канал, когда сопрограмма выполняется, она может уведомить основную сопрограмму и реализовать межсопрограммную связь. Давайте обсудим это на следующем уроке.
анонимная сопрограмма
Как упоминалось в статье о функциях, существует анонимная функция, и вызов анонимной функции с помощью ключевого слова go является анонимной сопрограммой. Модифицируем предыдущий пример:
func main() {
go func() {
fmt.Println("hello world goroutine")
}()
time.Sleep(1*time.Second)
fmt.Println("main goroutine")
}
Выход такой же, как и раньше.
Надеюсь, эта статья принесет вам что-то, Добрый день!
(Конец полного текста)
Оригинал статьи, если нужно перепечатать, указывайте источник!
Добро пожаловать, чтобы отсканировать код и подписаться на официальный аккаунт »Голанг здесь” или двигатьсяseekload.net, см. больше замечательных статей.
Я подготовил для вас книги, связанные с изучением языка Go, и официальный аккаунт будет отвечать на [e-book] в фоновом режиме!