Các chương trình lớn được chia thành các chương trình con nhỏ hơn. Các chương trình chạy các thành phần nhỏ hơn của chúng cùng một lúc được gọi là Concurrency.
Các bài viết liên quan:
GOROUTINES
Các phần của một ứng dụng chạy Concurrency được gọi là goroutines. Goroutines và Channel được sử dụng để cấu trúc các chương trình Concurrency.
Tiến trình là một thực thể thực thi độc lập chạy trong một máy chạy trong không gian địa chỉ riêng của nó trong bộ nhớ. Một tiến trình có các luồng là các thực thể đang thực thi Concurrency. Các chủ đề chia sẻ cùng một không gian địa chỉ của tiến trình.
Goroutines nhẹ, nhẹ hơn nhiều so với một sợi. Các goroutines chạy trong cùng một không gian địa chỉ, vì vậy việc truy cập vào bộ nhớ dùng chung phải được đồng bộ hóa; Điều này có thể được thực hiện bằng gói đồng bộ, nhưng bạn nên sử dụng các Channel để đồng bộ hóa các goroutines.
Một chương trình goroutine được triển khai dưới dạng một hàm hoặc một phương thức. Nó được gọi (gọi) với từ khóa ‘go’. Khi quy trình kết thúc, không có gì được trả lại cho hàm người gọi.
Kết quả:
Race
Điều kiện chạy Race xảy ra trong Go khi hai hoặc nhiều goroutine cố gắng truy cập vào cùng một tài nguyên. Nó có thể xảy ra khi một biến cố gắng đọc và ghi tài nguyên mà không liên quan đến các quy trình khác.
Ví dụ:
Kết quả
MUTEX
Các khóa Loại trừ lẫn nhau hoặc nút tắt tiếng có thể được sử dụng để đồng bộ hóa quyền truy cập vào trạng thái và truy cập dữ liệu một cách an toàn trên nhiều tuyến đường. Nó hoạt động như một người bảo vệ lối vào của phần mã quan trọng để chỉ một luồng có thể vào phần quan trọng tại một thời điểm.
Chúng tôi đặt một khóa xung quanh các dòng mã cụ thể với nó. Trong khi một Goroutine giữ khóa, tất cả các Goroutines khác đều bị ngăn không cho thực thi bất kỳ dòng mã nào được bảo vệ bởi cùng một mutex và buộc phải đợi cho đến khi khóa được hoàn thành trước khi chúng có thể tiếp tục.
Ví dụ:
Kết quả
BIẾN NGUYÊN TỬ
Các biến nguyên tử được sử dụng để quản lý trạng thái, mặc dù gói đồng bộ / nguyên tử và tránh các điều kiện Race. Bộ đếm nguyên tử có thể được truy cập bằng nhiều quy trình.
Ví dụ:
Kết quả
Channel
Channel hoạt động như một đường ống mà qua đó chúng tôi gửi các giá trị đã nhập từ một Goroutine này sang một Goroutine khác. Nó đảm bảo đồng bộ hóa vì chỉ một Goroutine có quyền truy cập vào một mục dữ liệu tại bất kỳ thời điểm nào. Quyền sở hữu dữ liệu được chuyển giữa các Goroutine khác nhau. Do đó, theo thiết kế, nó tránh được những cạm bẫy của bộ nhớ dùng chung và ngăn chặn tình trạng Race.
Ví dụ
Kết quả
Worker Pools
Worker Pools là một thiết kế trong đó một số lượng cố định m worker (Go goroutines) làm việc trên n nhiệm vụ trong một hàng đợi công việc (Go channel). Công việc nằm trong một hàng đợi cho đến khi một nhân viên hoàn thành nhiệm vụ hiện tại của nó và kéo một công việc mới.
Kết quả
Trong ví dụ này, 2 công nhân được bắt đầu và 9 hạng mục công việc được Race vào một Channel việc làm. Người lao động có một vòng lặp công việc với thời gian. Ngủ để mỗi người kết thúc làm 2 công việc. Đóng được sử dụng trên Channel sau khi tất cả công việc đã được Race vào nó, điều này báo hiệu cho tất cả 2 công nhân rằng họ có thể thoát khỏi vòng lặp công việc của họ bằng cách thả họ ra khỏi vòng lặp của họ trên phạm vi.