Введение

Go имеет встроенные возможности, которые значительно улучшают управление параллелизмом, даже если его сложно поддерживать. Одна из этих функций называется Go Routines и упрощает разработку параллельного программирования.

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

Что такое Go-процедуры?

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

Как работают процедуры Go?

Среда выполнения Go запускает новый поток выполнения при создании горутины. Среда выполнения Go планирует горутины и оптимально выполняет их в доступных потоках. Горутины могут общаться и обмениваться информацией, поскольку они используют одно и то же адресное пространство. Это обеспечивает безопасную и эффективную связь между горутинами.

Использование процедур Go для загрузки или выгрузки данных в S3

Скорость вашего приложения можно значительно повысить, используя Go Routines при загрузке или извлечении данных в S3. Вот иллюстрация того, как загружать файлы в S3 с помощью Go Routines:

package main

import (
 "fmt"
 "strings"
 "sync"

 "github.com/aws/aws-sdk-go/aws"
 "github.com/aws/aws-sdk-go/aws/session"
 "github.com/aws/aws-sdk-go/service/s3"
)

func uploadToS3(bucket string, key string, file string, wg *sync.WaitGroup) {
 defer wg.Done()
 sess, err := session.NewSession(&aws.Config{
  Region: aws.String("us-west-2")},
 )
 svc := s3.New(sess)
 _, err = svc.PutObject(&s3.PutObjectInput{
  Bucket: aws.String(bucket),
  Key:    aws.String(key),
  Body:   aws.ReadSeekCloser(strings.NewReader(file)),
 })
 if err != nil {
  fmt.Printf("Error uploading file %s to S3 bucket %s: %v\n", file, bucket, err)
  return
 }
 fmt.Printf("File %s uploaded successfully to S3 bucket %s\n", file, bucket)
}

func uploadFilesToS3(bucket string, files []string) {
 var wg sync.WaitGroup
 for _, file := range files {
  wg.Add(1)
  go uploadToS3(bucket, file, file, &wg)
 }
 wg.Wait()
}

func main() {
 bucket := "your-bucket-name"
 files := []string{"file1.txt", "file2.txt", "file3.txt"}
 uploadFilesToS3(bucket, files)
}

В этом коде мы определили две функции с именами uploadToS3 и uploadFilesToS3. Функция uploadToS3 отвечает за загрузку одного файла в указанную корзину S3, обеспечивая при этом выполнение всех горутин перед выходом из функции. Мы достигаем этого с помощью WaitGroup.

Функция uploadFilesToS3 используется для перебора списка файлов и создания новой горутины для каждого файла, загружаемого в указанную корзину S3. Опять же, мы используем WaitGroup, чтобы убедиться, что все горутины завершились перед выходом из функции.

В основной функции мы определяем имя корзины S3 и список файлов, которые мы хотим загрузить. Затем мы вызываем функцию uploadFilesToS3, чтобы начать процесс загрузки файла.

Чтобы все это заработало, нам нужно импортировать несколько пакетов, в том числе «fmt», «strings», «sync» и пакет AWS SDK для Go под названием «github.com/aws/aws-sdk-go».