Hiểu bối cảnh trong Go

Bối cảnh là một trong những tính năng quan trọng trong Go cho phép đồng thời. Trong Go, “bối cảnh” đề cập đến một gói cung cấp chức năng cho các giá trị trong phạm vi yêu cầu và tín hiệu hủy qua các ranh giới API.


Gói ngữ cảnh hoạt động đồng thời với mô hình tương tranh của Go, dựa trên khái niệm goroutines. Goroutines là các luồng thực thi nhẹ mà bạn có thể tạo và quản lý hiệu quả, giúp dễ dàng tạo các chương trình đồng thời trong Go.


Gói ngữ cảnh

Gói ngữ cảnh cung cấp chức năng hủy bỏ các chức năng chạy dài hoặc toàn bộ chuỗi cuộc gọi. Gói này cũng giúp lưu trữ các giá trị trong phạm vi yêu cầu để truy cập ở bất kỳ đâu trong chuỗi cuộc gọi. Tính năng này rất hữu ích khi làm việc với API hoặc vi dịch vụ, trong đó các yêu cầu có thể bao gồm nhiều lệnh gọi hàm và bạn muốn hủy chúng hoặc đính kèm các giá trị cụ thể cho chúng.

Đây là cách bạn có thể nhập gói ngữ cảnh vào các chương trình Go của mình.

 import "context"

Các hàm ngữ cảnh đảm nhận Định nghĩa bài văn loại cấu trúc của gói ngữ cảnh. Thông thường, bạn nên sử dụng ctx như tên của biến thể hiện.

 func operations(ctx context.Context) {
}

Các hàm có thể trả về kiểu cấu trúc Ngữ cảnh cho các hàm và hoạt động khác.

 func operations(ctx context.Context) context.Context {
}

Bạn có thể tạo một bối cảnh mới với LÀM chức năng của gói bối cảnh. Hàm TODO tạo ngữ cảnh mới với giá trị là context.Done(), một kênh sẽ đóng khi hủy ngữ cảnh. Bạn nên sử dụng nó như một trình giữ chỗ khi bạn cần ngữ cảnh nhưng không có ngữ cảnh gốc nào phù hợp.

 import "context"
func main() {
    ctx := context.TODO()
}


Ngoài ra, các Tiểu sử chức năng tạo ngữ cảnh mới không có giá trị và kênh Xong trống.

 ctx := context.Background()

Bạn nên sử dụng chức năng Nền làm gốc của cây ngữ cảnh.

Bối cảnh với các giá trị

Gói ngữ cảnh cung cấp chức năng truyền các giá trị và tín hiệu hủy bỏ. Bạn có thể sử dụng các giá trị cho thông tin từ dữ liệu trong phạm vi yêu cầu đến tín hiệu hủy bỏ và thời hạn.

Gói ngữ cảnh cũng cho phép tạo ngữ cảnh con kế thừa từ ngữ cảnh gốc, cho phép xử lý hiệu quả các giá trị và tín hiệu hủy trong suốt chương trình vì bạn có thể chuyển ngữ cảnh qua nhiều chức năng.

Đây là một ví dụ về việc chuyển ngữ cảnh qua các hàm bằng gói ngữ cảnh.

 import (
    "context"
)
func valuableContext(ctx context.Context) context.Context {
    return context.WithValue(ctx, "pass-key", "hfouneqcelkwfu")
}


func receiveContextData(ctx context.Context) any {
    passKey := ctx.Value("pass-key")
    return passKey
}


Các bối cảnh có giá trị hàm nhận một thể hiện ngữ cảnh và trả về một thể hiện ngữ cảnh cho hàm sau. Thể hiện ngữ cảnh là một giá trị được tạo bằng WithValue phương pháp. Phương thức WithValue lấy thể hiện ngữ cảnh từ hàm và một cặp khóa-giá trị.

Để truy xuất dữ liệu từ ngữ cảnh, bạn sẽ cần tạo một ngữ cảnh mới với LÀM hoặc là Tiểu sử chức năng và chuyển ngữ cảnh cho hàm (trong trường hợp này là valueContext) và nhận ngữ cảnh với nhận dữ liệu bối cảnh hàm số.

 func main() {
    ctx := context.Background()
    ctx = valuableContext(ctx)
    fmt.Println(receiveContextData(ctx))
}


Biến ctx là thể hiện ngữ cảnh từ hàm Nền. Hàm valueContext nhận vào biến ctx và trả về ngữ cảnh có giá trị mà hàm getContextData nhận vào và trả về giá trị từ cặp khóa-giá trị.

ngữ cảnh theo kết quả mã giá trị

Thời gian chờ theo ngữ cảnh và thời hạn

Các định nghĩa bài văn gói cung cấp chức năng thiết lập thời gian chờ và thời hạn trong hoạt động. Đặt thời gian chờ và thời hạn rất hữu ích cho các hoạt động cần bắt kịp.

Thời gian chờ là khoảng thời gian một hoạt động mất. Bạn có thể đặt thời gian chờ cho một thao tác là 4 giây; sau đó, bối cảnh hủy bỏ yêu cầu.

Mặt khác, thời hạn xác định điểm tuyệt đối mà một hoạt động nên hủy bỏ.

Bạn có thể dùng WithTimeout phương pháp để đặt thời gian chờ ngữ cảnh. Đây là cách bạn có thể đặt thời gian chờ 2 giây.

 func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 2 * time.Second)
    defer cancel()
    
}


Các chủ yếu chức năng tạo ngữ cảnh với thời gian chờ là hai giây. Hàm WithTimeout trả về một hàm hủy mà bạn có thể trì hoãn việc hủy khi thoát khỏi hàm chính.

Bạn có thể khai báo thời hạn với Với thời hạn phương pháp. Phương thức WithDeadline lấy một thể hiện ngữ cảnh và một thời hạn.

 func doSomething(ctx context.Context) {
    deadlineTime := time.Now().Add(1500 * time.Millisecond)
    ctx, ctxCancel := context.WithDeadline(ctx, deadlineTime)
    defer ctxCancel()
    


    ctxCancel()
}


Các làm việc gì đó chức năng có trong một bối cảnh, và thời hạn biến là thời gian trước khi định nghĩa bài văn đường giới hạn. Các ctx biến là bối cảnh có thời hạn.

Các ctxHủy biến hủy bối cảnh khi bối cảnh vượt quá thời hạn của nó.

Các phương pháp hay nhất để sử dụng bối cảnh trong Go

Tránh sử dụng ngữ cảnh làm biến toàn cục. Việc sử dụng ngữ cảnh làm biến toàn cục có thể dẫn đến các hành vi mã không mong muốn và các lỗi khó theo dõi, đồng thời sử dụng ngữ cảnh một cách tiết kiệm để giảm độ phức tạp của mã.

Cuối cùng, hãy sử dụng ngữ cảnh làm tín hiệu chứ không phải bảo đảm. Hủy bỏ một bối cảnh không đảm bảo rằng tất cả các goroutine sẽ ngừng chạy; nó chỉ đơn thuần là một tín hiệu và goroutines không biết gì về bối cảnh.

Previous Post
Next Post

post written by: