Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan konteks untuk melaksanakan kawalan tamat masa dalam Go

Cara menggunakan konteks untuk melaksanakan kawalan tamat masa dalam Go

WBOY
WBOYasal
2023-07-21 14:28:532074semak imbas

Cara menggunakan konteks untuk melaksanakan kawalan tamat masa dalam Go

Pengenalan:
Apabila menulis program serentak, kawalan tamat masa ialah teknologi yang sangat penting. Apabila program perlu melakukan operasi, jika operasi tidak dapat diselesaikan dalam masa yang ditetapkan, kami berharap dapat mengganggunya dan melakukan pemprosesan lain. Dalam bahasa Go, kita boleh menggunakan pakej konteks untuk melaksanakan kawalan tamat masa.

  1. Pengenalan kepada konteks
    Konteks ialah mekanisme dalam bahasa Go yang direka khusus untuk mengendalikan tugas serentak. Ia boleh digunakan untuk menghantar isyarat pembatalan, isyarat tamat masa dan metadata skop permintaan. Dengan menggunakan pakej konteks, kami boleh menangani isu tamat masa dalam operasi serentak dengan anggun.
  2. Gunakan konteks untuk melaksanakan kawalan tamat masa
    Di bawah kami menggunakan contoh untuk menerangkan cara menggunakan konteks untuk melaksanakan kawalan tamat masa. Katakan kita mempunyai fungsi yang perlu dilaksanakan dalam masa 3 saat, jika tidak, kita akan mengganggunya dan melakukan pemprosesan lain. Pertama, kita perlu mengimport pakej konteks.
import (
    "context"
    "fmt"
    "time"
)

Seterusnya, kami mentakrifkan fungsi yang melakukan beberapa operasi yang memakan masa. Dalam fungsi, kami menggunakan penyataan pilih untuk memantau sama ada isyarat Done() konteks dicetuskan, jika ia dicetuskan, operasi semasa boleh terganggu.

func doSomething(ctx context.Context) {
    // 模拟一个耗时操作
    time.Sleep(5 * time.Second)
    
    select {
    case <-ctx.Done():
        fmt.Println("操作被中断")
        return
    default:
        fmt.Println("操作执行成功")
    }
}

Seterusnya, kita perlu mencipta objek konteks dalam fungsi utama dan menetapkan tamat masa kepada 3 saat.

func main() {
    // 创建一个context对象,并设置超时时间为3秒
    ctx, cancel := context.WithTimeout(context.Background(), 3 * time.Second)
    defer cancel()

    // 在新的goroutine中执行操作,并传入context对象
    go doSomething(ctx)

    // 等待3秒,让操作有足够的时间执行
    time.Sleep(3 * time.Second)
}

Dalam contoh di atas, kami menggunakan fungsi WithTimeout untuk mencipta objek konteks yang mengandungi tamat masa dan menghantarnya ke dalam fungsi doSomething. Kemudian kita tunggu 3 saat dalam fungsi utama untuk memberikan fungsi doSomething cukup masa untuk dilaksanakan. Jika fungsi doSomething dilaksanakan dalam masa 3 saat, "Operasi telah berjaya dilaksanakan" akan menjadi output jika ia melebihi 3 saat dan isyarat tamat masa dicetuskan, "Operasi telah terganggu" akan dikeluarkan.

  1. Gunakan konteks untuk mengendalikan kawalan tamat masa bagi berbilang gorouti
    Dalam senario serentak sebenar, kita selalunya perlu mengendalikan kawalan tamat masa bagi berbilang gorouti. Kod sampel berikut menunjukkan cara menggunakan konteks untuk mengendalikan kawalan tamat masa untuk berbilang goroutin.
func worker(ctx context.Context, name string) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println(name, "被中断")
            return
        default:
            fmt.Println(name, "正常执行")
            time.Sleep(time.Second)
        }
    }
}

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

    go worker(ctx, "worker1")
    go worker(ctx, "worker2")
    go worker(ctx, "worker3")

    // 等待3秒钟,观察goroutine的执行情况
    time.Sleep(3 * time.Second)
}

Dalam kod di atas, kami mentakrifkan fungsi pekerja, yang akan terus mengeluarkan nama goroutine semasa dan tidur selama satu saat. Kemudian kami memulakan goroutine tiga pekerja dalam fungsi utama dan lulus dalam objek konteks yang sama. Kami menggunakan fungsi WithTimeout untuk mencipta objek konteks yang mengandungi tamat masa dan menghantarnya ke dalam fungsi pekerja. Kemudian kami menunggu 3 saat dalam fungsi utama untuk memerhatikan pelaksanaan goroutine. Apabila melebihi 3 saat, isyarat tamat masa dicetuskan dan goroutine akan mengeluarkan "terganggu".

Ringkasan:
Dengan menggunakan pakej konteks, kami boleh melaksanakan kawalan tamat masa secara elegan untuk operasi serentak. Apabila menulis program serentak, penggunaan konteks yang rasional bukan sahaja dapat meningkatkan kebolehpercayaan program, tetapi juga mengelakkan penyekatan jangka panjang dan meningkatkan prestasi program. Saya harap artikel ini akan membantu anda memahami kawalan tamat masa dalam pengaturcaraan serentak.

Atas ialah kandungan terperinci Cara menggunakan konteks untuk melaksanakan kawalan tamat masa dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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