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ì?
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) và luồng (thread) trong hệ điều hành nhé.
|
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. Goroutines và thread 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 CPU | Goroutines đượ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ố định | Goroutines 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 thread | Goroutines sử dụng channels để tương tác với nhau với độ trễ thấp |
Thread có định danh | Goroutine không có định danh |
Khởi tạo và giải phóng thread tốn nhiều thời gian | Goroutines đượ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 |