Ngôn ngữ lập trình Go và Goroutines là gì mà dân tình xôn xao thế?

Go là một ngôn ngữ lập trình tương đối mới mẻ do Google thiết kế và phát triển. Nó được kỳ vọng sẽ giúp ngành công nghiệp phần mềm khai thác tối đa nền tảng đa lõi của bộ vi xử lý và hoạt động đa nhiệm tốt hơn.

 

Tác giả bài viết: Bạn Quý Đăng

Bộ phận: R&D

Go là gì?

Gopher (chuột nang) - Linh vật của ngôn ngữ lập trình Go, được thiết kế bởi Renée French.

Ngôn ngữ lập trình Go ban đầu được thiết kế và phát triển bởi một nhóm kỹ sư thuộc Google bao gồm Robert Griesemer, Ken Thompson và Rob Pike vào năm 2007. Go là ngôn ngữ lập trình mã nguồn mở, dạng biên dịch (compiled language), có kiểu tĩnh (statically typed). Go được thiết kế để chạy đa luồng (multiple cores) và hỗ trợ concurrency rất tốt. Bên cạnh đó ngôn ngữ này tương thích đa nền tảng, biên dịch nhanh, chạy nhanh, và còn có cú pháp khá đơn giản nên dễ học, dễ đọc và dễ làm việc.

Trong nhiều năm trở lại đây, Go là một ngôn ngữ được ưa chuộng khi viết các chương trình Micro Services vì những đặc tính như nhỏ gọn, biên dịch nhanh, có thể import thư viện từ github, cú pháp đơn giản nhưng hiện đại. Một số công nghệ được bằng viết bằng Go tiêu biểu như: Docker, Kubernetes, CockroachDB, ...

Go có những ứng dụng trong một số lĩnh vực như:

  • Cloud & Network Services
  • Command-line Interfaces (CLIs)
  • Web Development
  • DevOps & SRE

Goroutines

Trước khi tìm hiểu về Goroutines, hãy cùng ôn lại một số khái niệm về tiến trình (process)luồng (thread) trong hệ điều hành nhé.

  • Tiến trình (process): có thể hiểu đơn giản là một chương trình đang chạy trong máy tính. Mỗi tiến trình sẽ có một luồng chính (main thread) để chạy chương trình và được hệ điều hành cấp pháp cho một không gian bộ nhớ nhất định. Khi main thread ngừng hoạt động đồng nghĩa với việc chương trình bị tắt.
  • Luồng (thread): thread hay còn được gọi là tiểu trình là một luồng trong tiến trình đang chạy. Các luồng được chạy song song trong tiến trình và có thể truy cập đến vùng nhớ được cung cấp bởi tiến trình. Những thread sẽ được cấp pháp riêng một vùng nhớ stack để lưu trữ biến riêng của thread đó.

Goroutines vs System Threads

Golang sử dụng Goroutine để xử lý đồng thời nhiều tác vụ. Goroutines là hàm hoặc phương thức chạy đồng thời với các hàm hoặc phương thức khác. Việc khởi tạo goroutines sẽ tốn ít chi phí hơn khởi tạo thread so với các ngôn ngữ khác. Goroutinesthread cũng không giống nhau.

Như đã nói ở trên thread sẽ có một kích thước vùng nhớ stack cố định. Vùng nhớ này chủ yếu được sử dụng để lưu trữ những tham số, biến cục bộ và địa chỉ trả về khi chúng ta gọi hàm.

Chính vì kích thước cố định của stack nên dẫn đến hai vấn đề:

  • Gặp hiện tượng stack overflow với những chương trình gọi hàm đệ quy sâu.
  • Lãng phí vùng nhớ đối với chương trình đơn giản.

Với Goroutines thì vẫn đề này đã được khắc phục bằng cách cấp pháp linh hoạt vùng nhớ stack:

  • Một Goroutines sẽ được bắt đầu bằng một vùng nhớ nhỏ.
  • Khi chương trình chạy nếu không gian stack hiện tại không đủ, Goroutines sẽ tự động tăng không gian stack.
  • Do chi phí việc khởi tạo nhỏ nên ta có thể dễ dàng giải phóng hàng ngàn Goroutines.

Trong Java thì các thread được quản lý bởi hệ điều hành nên chương trình đang xử lý đồng thời bị phụ thuộc vào hệ điều hành. Còn Golang sử dụng Go runtime có cơ chế riêng cho Goroutines, nó dùng một số kỹ thuật ghép các Goroutines với các thread của hệ điều hành.

 

Thread

Goroutines

Thread được quản lý bởi hệ điều hành và phụ thuộc vào số nhân của CPUGoroutines được quản lý bởi go runtime và không phụ thuộc vào số nhân CPU
Thread có kích cỡ vùng nhớ stack cố địnhGoroutines có kích cỡ vùng nhớ stack tùy theo chương trình
Giao tiếp giữa các thread khá khó. Có đỗ trễ lớn trong việc tương tác giữa các threadGoroutines sử dụng channels để tương tác với nhau với độ trễ thấp
Thread có định danhGoroutine không có định danh
Khởi tạo và giải phóng thread tốn nhiều thời gianGoroutines được khởi tạo và giải phóng bởi go runtime nên rất nhanh

 

Các tài liệu tham khảo hay về Go:

Xem thêm về các ví dụ về Goroutines tại bài viết gốc của tác giả Quý Đăng đăng tải trên Viblo: https://sal.vn/SN_GoLangViblo 

Viblo là dịch vụ chia sẻ và học tập kiến thức IT dành cho lập trình viên Việt Nam, được phát triển và vận hành bởi Sun*. Viblo ra đời với mục tiêu trở thành nền tảng tối ưu dành cho các lập trình viên, nơi mọi người có thể tự do học hỏi, chia sẻ và thể hiện các kỹ năng CNTT của riêng mình.

Website: www.viblo.asia

 

#Chia sẻ kiến thức

#Viblo

#Go

#Golang

#Goroutine