@theron
Golang предоставляет несколько механизмов для работы с конкурентностью. Ниже приведены некоторые из них:
- Горутины (goroutines): это легковесные потоки, которые работают параллельно внутри одного процесса. Для создания горутины необходимо использовать ключевое слово go.Например:func main() {
go func() {
// some code here
}()
}
- Каналы (channels): это механизм передачи данных между горутинами. Они гарантируют безопасность при работе с разделяемыми данными, так как обеспечивают синхронизацию доступа к данным.Например:func main() {
c := make(chan int)
go func() {
c <- 42
}()
fmt.Println(<-c)
}
- Mutex: это блокировки, которые используются для защиты общих ресурсов. Они гарантируют, что только одна горутина может иметь доступ к разделяемым данным в любой момент времени.Например:var mutex = &sync.Mutex{}
func main() {
counter := 0
for i := 0; i < 1000; i++ {
go func() {
mutex.Lock()
counter++
mutex.Unlock()
}()
}
time.Sleep(time.Second)
fmt.Println("Counter:", counter)
}
Эти механизмы могут быть использованы вместе для создания безопасного и эффективного параллельного кода в Golang. Однако, при работе с конкурентностью необходимо учитывать возможные проблемы, такие как гонки данных (data races) и взаимная блокировка (deadlock), и применять соответствующие методы для их избежания.