Введение
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».