Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menyelesaikan masalah pengembangan dinamik tugas serentak dalam bahasa Go?

Bagaimana untuk menyelesaikan masalah pengembangan dinamik tugas serentak dalam bahasa Go?

WBOY
WBOYasal
2023-10-09 13:07:411273semak imbas

Bagaimana untuk menyelesaikan masalah pengembangan dinamik tugas serentak dalam bahasa Go?

Bagaimana untuk menyelesaikan masalah pengembangan dinamik tugas serentak dalam bahasa Go?

Apabila sejumlah besar tugas serentak perlu diproses, kami mungkin perlu melaraskan bilangan goroutin serentak secara dinamik untuk mencapai pemprosesan tugasan yang cekap. Dalam bahasa Go, anda boleh menggunakan goroutine dan saluran untuk melaksanakan pengaturcaraan serentak Dengan melaraskan bilangan goroutine, anda boleh mengawal pelaksanaan tugas serentak dengan berkesan.

Untuk menyelesaikan masalah pengembangan dinamik tugas serentak, kami boleh menggunakan kumpulan goroutine untuk menguruskan bilangan goroutin serentak, dan menggunakan saluran untuk mengagihkan tugas dan mengumpul hasil. Berikut ialah kod sampel:

package main

import (
    "fmt"
    "sync"
    "time"
)

type Pool struct {
    queue chan Job
    wg    sync.WaitGroup
}

type Job struct {
    id     int
    result string
}

func NewPool(maxWorkers int) *Pool {
    pool := &Pool{
        queue: make(chan Job),
    }

    for i := 0; i < maxWorkers; i++ {
        go pool.worker(i)
    }

    return pool
}

func (p *Pool) worker(id int) {
    for job := range p.queue {
        fmt.Printf("Worker %d processing job %d
", id, job.id)
        time.Sleep(time.Second) // 模拟任务耗时
        job.result = fmt.Sprintf("Job %d processed by worker %d", job.id, id)
        p.wg.Done()
    }
}

func (p *Pool) AddJob(job Job) {
    p.wg.Add(1)
    p.queue <- job
}

func (p *Pool) Wait() {
    p.wg.Wait()
    close(p.queue)
}

func main() {
    pool := NewPool(3)

    for i := 1; i <= 10; i++ {
        job := Job{id: i}
        pool.AddJob(job)
    }

    pool.Wait()
}

Dalam kod sampel di atas, kami mentakrifkan struktur Pool untuk mengurus kumpulan goroutine, yang mengandungi saluran untuk menyimpan tugas dan saluran untuk menunggu semua sync.WaitGroup apabila tugasan selesai. Pool结构体来管理goroutine池,其中包含一个用于存放任务的channel和一个用于等待所有任务完成的sync.WaitGroup

NewPool函数用于创建一个新的goroutine池,其中会根据指定的maxWorkers参数创建对应数量的goroutine,并调用worker函数进行任务的处理。

worker函数为每个goroutine的主体函数,它通过从任务channel中获取任务,并处理任务。在处理任务之前,可以根据具体需求进行一些预处理或其他操作。任务处理完成后,将结果赋值给job.result字段,并通过sync.WaitGroupDone方法来通知任务完成。

AddJob方法用于添加新的任务到任务channel中,它会通过sync.WaitGroupAdd方法增加等待的任务数量,并将任务放入队列中。

Wait方法用于等待所有任务完成,它会调用sync.WaitGroupWait方法来阻塞主线程,直到所有任务都被完成。

最后,在main函数中,我们创建了一个大小为3的goroutine池,并添加了10个任务。通过调整maxWorkers

Fungsi NewPool digunakan untuk mencipta kolam goroutine baharu, yang akan mencipta bilangan goroutine yang sepadan mengikut parameter maxWorkers yang ditentukan dan memanggil worker kod> Fungsi melaksanakan pemprosesan tugas. <p></p>Fungsi <kod>pekerja</kod> ialah fungsi utama setiap goroutine Ia memperoleh tugas daripada saluran tugas dan memproses tugasan. Sebelum memproses tugas, beberapa prapemprosesan atau operasi lain boleh dilakukan mengikut keperluan khusus. Selepas pemprosesan tugasan selesai, tetapkan hasilnya pada medan job.result dan maklumkan penyempurnaan tugasan melalui kaedah Selesai sync.WaitGroup. 🎜🎜Kaedah AddJob digunakan untuk menambah tugasan baharu pada saluran tugasan Ia akan meningkatkan bilangan tugasan menunggu melalui WaitGroup's Add<.> kaedah , dan meletakkan tugasan ke dalam baris gilir. 🎜🎜Kaedah <code>Tunggu digunakan untuk menunggu semua tugasan selesai Ia akan memanggil kaedah Tunggu sync.WaitGroup untuk menyekat. benang utama sehingga semua tugasan selesai. 🎜🎜Akhir sekali, dalam fungsi utama, kami mencipta kumpulan goroutine bersaiz 3 dan menambah 10 tugasan. Dengan melaraskan nilai parameter maxWorkers, kami boleh melaraskan bilangan goroutin serentak secara dinamik. 🎜🎜Dengan kod contoh di atas, kami boleh menyelesaikan masalah pengembangan dinamik tugas serentak dengan mudah. Dengan mengawal bilangan gorout serentak secara munasabah, kami boleh menggunakan mekanisme serentak bahasa Go untuk mencapai pemprosesan tugas yang cekap. 🎜

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah pengembangan dinamik tugas serentak dalam bahasa 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