Rumah > pembangunan bahagian belakang > Golang > Mekanisme tamat masa dan pembatalan Goroutine dan Saluran di Golang

Mekanisme tamat masa dan pembatalan Goroutine dan Saluran di Golang

PHPz
Lepaskan: 2023-08-07 13:17:09
asal
1261 orang telah melayarinya

Masa tamat dan mekanisme pembatalan Goroutine dan Saluran di Golang

Di Golang, Goroutine dan Saluran adalah komponen penting pengaturcaraan serentak. Goroutines ialah pelaksanaan utas ringan dalam bahasa Go yang membolehkan kami melaksanakan berbilang tugas secara serentak dengan mudah. Saluran ialah mekanisme komunikasi antara Goroutines, digunakan untuk memindahkan data dan menyegerakkan tugas.

Dalam pengaturcaraan serentak sebenar, kadangkala kita perlu mengawal masa pelaksanaan Goroutines, atau membatalkan pelaksanaan Goroutines di bawah syarat tertentu tertentu. Untuk mencapai fungsi ini, Golang menyediakan mekanisme tamat masa dan pembatalan. Di bawah, kami akan memperkenalkan secara terperinci cara menggunakan mekanisme ini di Golang dan memberikan contoh kod yang sepadan.

  1. Mekanisme tamat masa Goroutines

Mekanisme tamat masa Goroutines boleh memastikan bahawa tugasan dilaksanakan dalam masa yang ditetapkan Jika tugasan tidak selesai selepas masa yang ditetapkan, tugasan akan dibatalkan kerana tamat masa. Golang menyediakan pakej context untuk melaksanakan fungsi ini. Berikut ialah contoh kod yang menggunakan mekanisme tamat masa Goroutines: context 包来实现这个功能。下面是一个使用 Goroutines 超时机制的示例代码:

package main

import (
    "context"
    "fmt"
    "time"
)

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("任务被取消,退出 Goroutine")
            return
        default:
            fmt.Println("正在执行任务...")
            time.Sleep(1 * time.Second)
        }
    }
}

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

    go worker(ctx)

    time.Sleep(10 * time.Second)
}
Salin selepas log masuk

在上面的代码中,我们使用 context.WithTimeout 函数创建了一个具有 5 秒超时时间的上下文对象,然后调用 go worker(ctx) 启动了一个 Goroutine 执行任务。在任务执行过程中,通过 select 语句监听 ctx.Done() 通道,如果收到取消信号则退出 Goroutine。

注意,在 main 函数中我们通过 time.Sleep(10 * time.Second) 设置了一个 10 秒等待,这是为了确保 Goroutine 执行超时。运行以上代码,我们可以观察到在 5 秒超时时间到达后,worker Goroutine 会收到取消信号并退出。

  1. Goroutines 的取消机制

Goroutines 的取消机制可以在特定条件下取消执行中的任务。我们同样可以使用 context 包来实现这个功能。看下面的代码示例:

package main

import (
    "context"
    "fmt"
    "time"
)

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("任务被取消,退出 Goroutine")
            return
        default:
            fmt.Println("正在执行任务...")
            time.Sleep(1 * time.Second)
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    go worker(ctx)

    time.Sleep(5 * time.Second)

    cancel()
    fmt.Println("取消任务...")
    time.Sleep(2 * time.Second)
}
Salin selepas log masuk

在上面的代码中,我们使用 context.WithCancel 函数创建了一个取消上下文对象,然后调用 go worker(ctx) 启动了一个 Goroutine 执行任务。在任务执行过程中,通过 select 语句监听 ctx.Done() 通道,如果收到取消信号则退出 Goroutine。

main 函数中,我们通过 time.Sleep(5 * time.Second) 设置了一个 5 秒等待,然后调用 cancel() 取消任务。运行以上代码,我们可以观察到在调用 cancel() 后,worker Goroutine 会立即收到取消信号并退出。

总结:

通过上述代码示例,我们学习了 Golang 中 Goroutines 和 Channels 的超时和取消机制。通过使用 contextrrreee

Dalam kod di atas, kami menggunakan fungsi context.WithTimeout untuk mencipta objek konteks dengan tamat masa 5 saat, dan kemudian memanggil go worker(ctx) memulakan tugas pelaksanaan Goroutine. Semasa pelaksanaan tugas, dengar saluran ctx.Done() melalui pernyataan select dan keluar dari Goroutine jika isyarat pembatalan diterima.

Perhatikan bahawa dalam fungsi utama kami menetapkan menunggu 10 saat melalui time.Sleep(10 * time.Second), iaitu untuk memastikan masa pelaksanaan Goroutine keluar. Menjalankan kod di atas, kita dapat melihat bahawa selepas tamat masa 5 saat mencapai, pekerja Goroutine akan menerima isyarat pembatalan dan keluar. 🎜
    🎜Mekanisme pembatalan Goroutines 🎜🎜🎜Mekanisme pembatalan Goroutines boleh membatalkan pelaksanaan tugas di bawah syarat tertentu. Kita juga boleh menggunakan pakej context untuk mencapai fungsi ini. Lihat contoh kod di bawah: 🎜rrreee🎜Dalam kod di atas, kami menggunakan fungsi context.WithCancel untuk mencipta objek konteks pembatalan, dan kemudian panggil go worker(ctx) untuk memulakannya Cipta Goroutine untuk melaksanakan tugas. Semasa pelaksanaan tugas, dengar saluran ctx.Done() melalui pernyataan select dan keluar dari Goroutine jika isyarat pembatalan diterima. 🎜🎜Dalam fungsi utama, kami menetapkan 5 saat menunggu melalui time.Sleep(5 * time.Second) dan kemudian panggil cancel() kod> kod> Batalkan tugas. Menjalankan kod di atas, kita dapat melihat bahawa selepas memanggil <code>cancel(), worker Goroutine akan segera menerima isyarat pembatalan dan keluar. 🎜🎜Ringkasan: 🎜🎜Melalui contoh kod di atas, kami mempelajari mekanisme tamat masa dan pembatalan Goroutine dan Saluran di Golang. Dengan menggunakan pakej context, kami boleh melaksanakan operasi tamat masa tugas dan pembatalan untuk mengawal pelaksanaan tugas serentak dengan lebih baik. Ini sangat berguna dalam pengaturcaraan serentak sebenar, dan boleh memastikan pelaksanaan tugas yang betul dan pelepasan sumber. 🎜🎜Saya harap artikel ini akan membantu anda memahami mekanisme tamat masa dan pembatalan Goroutines dan Saluran di Golang, dan saya harap anda boleh menggunakannya secara fleksibel dalam pembangunan sebenar. Terima kasih kerana membaca! 🎜

Atas ialah kandungan terperinci Mekanisme tamat masa dan pembatalan Goroutine dan Saluran di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan