Bagaimana untuk Mencipta Konteks dalam Go yang Mengabaikan Pembatalan?

Mary-Kate Olsen
Lepaskan: 2024-11-09 14:58:02
asal
634 orang telah melayarinya

How to Create a Context in Go That Ignores Cancellation?

Mencipta Konteks Tanpa Membatalkan Penyebaran dalam Go

Dalam Go, konteks membawa maklumat berkaitan pelaksanaan seperti tarikh akhir dan token pembatalan. Walau bagaimanapun, senario tertentu mungkin memerlukan penciptaan konteks berasingan yang berkongsi data yang sama tetapi tidak terjejas oleh pembatalan konteks asal.

Pernyataan Masalah

Tugas di tangan ialah mencipta "klon " (atau salinan) ctx konteks Go supaya:

  • Ia mengandungi semua nilai yang disimpan dalam ctx asal.
  • Ia tidak dibatalkan apabila ctx dibatalkan.

Penyelesaian

Memandangkan konteks.Konteks ialah antara muka, anda boleh menentukan pelaksanaan anda sendiri yang mengabaikan isyarat pembatalan. Berikut ialah contoh:

package main

import (
    "context"
    "time"
)

type noCancel struct {
    ctx context.Context
}

func (c noCancel) Deadline() (time.Time, bool)       { return time.Time{}, false }
func (c noCancel) Done() <-chan struct{}             { return nil }
func (c noCancel) Err() error                        { return nil }
func (c noCancel) Value(key interface{}) interface{} { return c.ctx.Value(key) }

// WithoutCancel returns a context that is never canceled.
func WithoutCancel(ctx context.Context) context.Context {
    return noCancel{ctx: ctx}
}

func main() {
    ctx := context.Background()
    clone := WithoutCancel(ctx)

    // Create a goroutine using the clone context.
    go func() {
        // This goroutine will never be interrupted by cancelations on `ctx`.
        time.Sleep(time.Second)
    }()
}
Salin selepas log masuk

Penggunaan

Anda boleh menggunakan fungsi WithoutCancel untuk mencipta konteks klon dalam mana-mana fungsi atau kaedah:

func f(ctx context.Context) {
    // Create a non-cancelable clone.
    clone := WithoutCancel(ctx)

    // Start an async task using the clone context.
    go func() {
        // This goroutine will not be affected by cancellations on `ctx`.
    }()
}
Salin selepas log masuk

Kesimpulan

Penyelesaian ini menyediakan cara mudah untuk mencipta konteks yang tidak pernah dibatalkan, membolehkan anda melakukan tugas tak segerak yang melebihi konteks asal. Ini amat berguna apabila anda ingin mengelakkan penamatan pramatang tugas latar belakang disebabkan pembatalan konteks.

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Konteks dalam Go yang Mengabaikan Pembatalan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan