日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

不少人面試都掛在這道題了!你掛了嗎?

來源: 責編: 時間:2023-11-28 09:36:29 234觀看
導讀能看到這篇文章一定是特殊的緣分,請務必珍惜,請詳細看看吧,哈哈。圖片不止上圖,最近 Go就業訓練營 中不少小伙伴說,面試中碰到了好幾次讓手撕協程池的公司。解題思路:定義協程池結構體:首先,我們需要定義一個協程池的結構體,包

能看到這篇文章一定是特殊的緣分,請務必珍惜,請詳細看看吧,哈哈。kuW28資訊網——每日最新資訊28at.com

圖片圖片kuW28資訊網——每日最新資訊28at.com

不止上圖,最近 Go就業訓練營 中不少小伙伴說,面試中碰到了好幾次讓手撕協程池的公司。kuW28資訊網——每日最新資訊28at.com

解題思路:

  1. 定義協程池結構體:首先,我們需要定義一個協程池的結構體,包含協程池的屬性和方法。結構體中需要包含一個任務隊列、協程池的大小、當前運行的協程數量等屬性。
  2. 初始化協程池:在初始化函數中,我們需要創建一個指定大小的任務隊列,并初始化協程池的屬性。
  3. 添加任務到協程池:當有任務需要執行時,我們將任務添加到任務隊列中。
  4. 啟動協程池:在啟動函數中,我們需要根據協程池的大小創建對應數量的協程,并從任務隊列中獲取任務進行執行。每個協程會不斷從任務隊列中獲取任務并執行,直到任務隊列為空。
  5. 控制協程數量:在協程池中,我們需要控制同時運行的協程數量,以防止過多的協程導致資源浪費。可以使用信號量或者計數器來控制協程的數量。

通過以上的解題思路,我們可以實現一個基本的協程池。kuW28資訊網——每日最新資訊28at.com

在實際應用中,可能還需要考慮一些其他的因素,如任務優先級、任務超時處理等。根據具體的需求,可以對協程池進行進一步的擴展和優化。kuW28資訊網——每日最新資訊28at.com

說完了解題思路,再給大家一個可參考,可運行的示例代碼:kuW28資訊網——每日最新資訊28at.com

示例代碼:

package mainimport (        "fmt"        "sync")type Job struct {        ID int}type Worker struct {        ID         int        JobChannel chan Job        Quit       chan bool}type Pool struct {        WorkerNum   int        JobChannel  chan Job        WorkerQueue chan chan Job        Quit        chan bool        wg          sync.WaitGroup}// NewWorker 創建一個新的工作者func NewWorker(id int, workerQueue chan chan Job) Worker {        return Worker{                ID:         id,                JobChannel: make(chan Job),                Quit:       make(chan bool),        }}// Start 啟動工作者func (w Worker) Start(workerQueue chan chan Job) {        go func() {                for {                        workerQueue <- w.JobChannel                        select {                        case job := <-w.JobChannel:                                fmt.Printf("Worker %d started job %d/n", w.ID, job.ID)                                // 執行任務                                fmt.Printf("Worker %d finished job %d/n", w.ID, job.ID)                        case <-w.Quit:                                return                        }                }        }()}// Start 啟動工作者池func (p *Pool) Start() {        for i := 0; i < p.WorkerNum; i++ {                worker := NewWorker(i, p.WorkerQueue)                worker.Start(p.WorkerQueue)        }        go func() {                for {                        select {                        case job := <-p.JobChannel:                                worker := <-p.WorkerQueue                                worker <- job                        case <-p.Quit:                                for i := 0; i < p.WorkerNum; i++ {                                        worker := <-p.WorkerQueue                                        worker <- Job{} // 發送空任務,通知協程退出                                }                                p.wg.Done()                                return                        }                }        }()}// AddJob 添加作業到作業通道func (p *Pool) AddJob(job Job) {        p.JobChannel <- job}// Stop 停止工作者池func (p *Pool) Stop() {        p.Quit <- true        p.wg.Wait()}func main() {        pool := Pool{                WorkerNum:   5,                JobChannel:  make(chan Job),                WorkerQueue: make(chan chan Job, 5),                Quit:        make(chan bool),        }        pool.Start()        for i := 0; i < 10; i++ {                job := Job{ID: i}                pool.AddJob(job)        }        pool.Stop()}

以下是對代碼的注釋:kuW28資訊網——每日最新資訊28at.com

  • Job 結構體定義了作業的 ID。
  • Worker 結構體定義了工作者的 ID、作業通道和退出通道。
  • Pool 結構體定義了工作者數量、作業通道、工作者隊列和退出通道,以及一個等待組(WaitGroup)。
  • NewWorker 函數創建一個新的工作者,并返回一個工作者實例。
  • Start 方法啟動一個工作者,它從工作者隊列中獲取自己的作業通道,并在循環中等待作業的到來,執行作業并在退出通道接收到信號時返回。
  • Pool 的 Start 方法啟動工作者池,創建指定數量的工作者,并將它們啟動。同時,它還啟動一個循環,等待作業的到來,并將作業分發給可用的工作者。
  • AddJob 方法將作業添加到作業通道中,供工作者池處理。
  • Stop 方法停止工作者池,向退出通道發送信號,并等待所有工作者完成當前作業后返回。
  • main 函數創建一個工作者池實例,啟動工作者池,并添加一些作業。最后,調用 Stop 方法停止工作者池。

答疑

有小伙伴提出了疑問:kuW28資訊網——每日最新資訊28at.com

WorkerQueue chan chan Job 的作用是什么?為什么要這么定義?kuW28資訊網——每日最新資訊28at.com

解答一下:

WorkerQueue chan chan Job 的作用是用于傳遞工作者(Worker)的作業通道(JobChannel)。它是一個通道(channel),其中每個元素都是一個作業通道。kuW28資訊網——每日最新資訊28at.com

為什么要這么定義呢?這是因為在工作者池模式中,每個工作者需要一個獨立的作業通道來接收作業。通過將每個工作者的作業通道放入一個通道中,可以實現對工作者的動態分配和管理。kuW28資訊網——每日最新資訊28at.com

具體來說,WorkerQueue 通道用于存儲每個工作者的作業通道。當有新的作業到達時,工作者池會從 WorkerQueue 中取出一個可用的工作者的作業通道,并將作業發送到該通道中,由相應的工作者進行處理。kuW28資訊網——每日最新資訊28at.com

這種設計可以有效地控制并發任務的分配和調度。通過將工作者的作業通道放入 WorkerQueue 中,可以實現對工作者的復用和動態管理,避免了頻繁地創建和銷毀工作者協程的開銷。kuW28資訊網——每日最新資訊28at.com

總結起來,WorkerQueue 的定義允許工作者池動態地管理工作者的作業通道,實現對并發任務的高效分配和調度。kuW28資訊網——每日最新資訊28at.com

運行結果

圖片圖片kuW28資訊網——每日最新資訊28at.com

總結

以上代碼實現了一個簡單的工作池(Worker Pool)模式。工作池由一組固定數量的工作者(Worker)協程組成,它們從作業通道(JobChannel)中獲取作業(Job)并執行。kuW28資訊網——每日最新資訊28at.com

本文轉載自微信公眾號「 程序員升級打怪之旅」,作者「  王中陽Go」,可以通過以下二維碼關注。kuW28資訊網——每日最新資訊28at.com

kuW28資訊網——每日最新資訊28at.com

轉載本文請聯系「 程序員升級打怪之旅」公眾號。kuW28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-34655-0.html不少人面試都掛在這道題了!你掛了嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 新一代WebFlux框架核心技術Reactor響應式編程基本用法

下一篇: 一個注解搞定多數據源切換,你學會了嗎?

標簽:
  • 熱門焦點
  • 6月安卓手機性價比榜:Note 12 Turbo斷層式碾壓

    6月份有一個618,雖然這是京東周年慶的日子,但別的電商也都不約而同的跟進了,反正促銷沒壞處,廠商和用戶都能滿意。618期間一些產品也出現了歷史低價,那么各個價位段的產品性價比
  • Java NIO內存映射文件:提高文件讀寫效率的優秀實踐!

    Java的NIO庫提供了內存映射文件的支持,它可以將文件映射到內存中,從而可以更快地讀取和寫入文件數據。本文將對Java內存映射文件進行詳細的介紹和演示。內存映射文件概述內存
  • 之家push系統迭代之路

    前言在這個信息爆炸的互聯網時代,能夠及時準確獲取信息是當今社會要解決的關鍵問題之一。隨著之家用戶體量和內容規模的不斷增大,傳統的靠"主動拉"獲取信息的方式已不能滿足用
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時候了!學弟,最近學習的怎么樣啊 了不起學弟:最近學習的還不錯,每天都在學習,每天都在進步! 了不起:那你最近學習的什么呢? 了不起學弟:最近在學習C
  • 雅柏威士忌多款單品價格大跌,泥煤頂流也不香了?

    來源 | 烈酒商業觀察編 | 肖海林今年以來,威士忌市場開始出現了降溫跡象,越來越多不斷暴漲的網紅威士忌也開始悄然回歸市場理性。近日,LVMH集團旗下蘇格蘭威士忌品牌雅柏(Ardbeg
  • 2023年,我眼中的字節跳動

    此時此刻(2023年7月),字節跳動從未上市,也從未公布過任何官方的上市計劃;但是這并不妨礙它成為中國最受關注的互聯網公司之一。從2016-17年的抖音強勢崛起,到2018年的&ldquo;頭騰
  • 華為開發者大會2023日程公開:開設鴻蒙HarmonyOS 4體驗區

    IT之家 7 月 31 日消息,華為今日公布了 HDC.Together 開發者大會 2023 的詳細日程。整場大會將于 8 月 4 日-6 日之間舉行,屆時將發布最新一代鴻蒙 H
  • iQOO Neo8系列今日官宣:首發天璣9200+ 全球安卓最強芯!

    在昨日舉行的的聯發科新一代旗艦芯片天璣9200+的發布會上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品將全球首發搭載這款當前性能最強大的移動平臺
  • 機構稱Q2全球智能手機出貨量同比下滑11% 蘋果份額依舊第2

    7月20日消息,據外媒報道,研究機構的報告顯示,由于需求下滑,今年二季度全球智能手機的出貨量,同比下滑了11%,三星、蘋果等主要廠商的銷量,較去年同期均有下
Top 主站蜘蛛池模板: 遂平县| 青神县| 织金县| 陇南市| 乳源| 沁阳市| 密云县| 冀州市| 瑞金市| 高唐县| 蒙阴县| 成武县| 正宁县| 白河县| 枞阳县| 米泉市| 广宁县| 时尚| 大丰市| 庄浪县| 石狮市| 洛扎县| 巴彦淖尔市| 金华市| 连城县| 应城市| 莎车县| 天峻县| 盐源县| 博白县| 阿荣旗| 清原| 左贡县| 方城县| 犍为县| 阿拉善左旗| 奉化市| 白朗县| 昭苏县| 兴宁市| 锦州市|