精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用Rust構建可以并發執行多個任務的線程池

開發 前端
線程池是工作線程的集合,創建這些線程是為了同時執行多個任務并等待新任務的到來。這意味著一開始創建了多個線程,并且所有線程都處于空閑狀態。

在這篇文章中讓我們探討一下如何使用Rust構建線程池來并發地管理多個任務。

在開始實際的編碼之前,讓我們首先了解線程池是什么以及它是如何工作的。

線程池

線程池是工作線程的集合,創建這些線程是為了同時執行多個任務并等待新任務的到來。這意味著一開始創建了多個線程,并且所有線程都處于空閑狀態。

每當你的系統獲得任務時,它可以快速地將任務分配給這些線程,從而節省大量時間,而無需多次創建和刪除線程。

圖片圖片

正如圖所看到的,線程池是等待從主線程接收任務以執行的多個線程的集合。

在該圖中,主線程中總共有15個任務,所有這些任務都被轉發給不同的工作線程并發執行。了解了線程池的概念后,讓我們來理解線程池的內部工作原理。

線程池是如何工作的?

在線程池體系結構中,主線程只有兩個任務:

1,接收所有的任務并將它們存儲在一個地方。

2,創建多個線程,并定期為它們分配不同的任務。

在接收任務之前創建線程集,并使用ID存儲在某個地方,以便我們可以通過ID識別它們。

然后每個線程都在等待接收任務,如果它們得到任務,就開始處理任務。完成任務后,他們再次等待下一個任務。

當該線程忙于執行任務時,主線程將更多的任務分配給其他線程,這樣在主線程結束任務之前沒有線程空閑。在完成所有任務后,主線程終止所有線程并關閉線程池。

現在我們了解了線程池是如何工作的。接下來,讓我們使用Rust實現一個線程池。

使用Rust實現線程池

1. 創建線程

我們需要一個函數來生成一個線程并返回它的JoinHandle。

此外,我們需要知道線程的ID,如果我們搞砸了,就可以用線程ID記錄錯誤,這樣我們就可以知道哪個線程出錯了。

可以看出,如果兩個相互關聯的數據需要組合,需要一個結構體。我們來創建一個:

struct Worker {
    id: usize,
    thread: JoinHandle<()>
}

現在我們實現一個可以返回新Worker的構造函數:

impl Worker {
    fn new(id: usize) -> Self {
        let thread = thread::spawn(|| {});

        Self {id, thread}
    }
}

現在,我們的函數已經準備好創建線程并將它們返回給調用者。

2. 存放線程

我們需要一個結構來保存所有線程的所有JoinHandles,我們還想控制線程池可以擁有多少線程。

這意味著,我們需要一個帶有構造函數的結構體,該函數指定一個數字來指示線程的數量,并且必須調用Worker來創建線程。

struct ThreadPool {
    workers: Vec<Worker>,
}

impl ThreadPool {
    fn new(size: usize) -> Self {
        assert!(size > 0, "Need at least 1 worker!");

        let mut workers = Vec::with_capacity(size);

        for i in 0..size {
            workers.push(Worker::new(i));
        }

        Self { workers }
    }
}

我們有了創建線程和管理線程的函數,現在是時候創建一個可以將任務分配給不同線程的函數了。

3. 給線程分配任務

我們的線程池結構體必須有一個函數,該函數可以在線程內部分配和執行任務。但是有一個問題,我們如何將任務發送給線程,以便線程能夠執行任務?

為此,我們需要一個task類型來表示我們需要完成的任務:

type task = Box<dyn FnOnce() + Send + 'static>;

在這里,意味著我們的任務必須實現Box<dyn>里的這些Trait:

1,實現FnOnce()意味著我們的任務是一個只能運行一次的函數。

2,實現Send,因為我們將任務從主線程發送到工作線程,所以將任務設置為Send類型,以便它可以在線程之間安全地傳輸。

3,實現'static,意味著我們的任務必須和程序運行的時間一樣長。

現在是時候將任務發送給工作線程了,但要做到這一點,我們必須在主線程和所有工作線程之間建立一個通道,因此我們需要使用Arc<Mutex<()>>。

讓我們來更新這兩個構造函數:

struct ThreadPool {
    workers: Vec<Worker>,
    sender: mpsc::Sender<Job>
}

impl ThreadPool {
    fn new(size: usize) -> Self {
        assert!(size > 0, "Need at least 1 worker!");

        let (sender, reciever) = mpsc::channel();
        let reciever = Arc::new(Mutex::new(reciever));

        let mut workers = Vec::with_capacity(size);

        for i in 0..size {
            workers.push(Worker::new(i, Arc::clone(&reciever)));
        }

        Self {
            workers,
            sender: Some(sender)
        }
    }
}

impl Worker {
    fn new(id: usize, reciever: Arc<Mutex<Receiver<Task>>>) -> Self {
        let thread = thread::spawn(move || {});

        Self {
            id,
            thread
        }
    }
}

在ThreadPool構造函數中,我們創建了一個新的通道,并在Arc<Mutex<()>>中封裝了接收器,我們把接收器發送給工作線程,以便主線程可以發送任務,工作線程可以接收任務。

此外,我們必須更新ThreadPool結構體,以包含一個發送者,它將被主線程用來向不同的線程發送任務。

現在,讓我們實現在工作線程中執行任務的邏輯:

fn new(id: usize, reciever: Arc<Mutex<Receiver<task>>>) -> Self {
    let thread = thread::spawn(move || {
        loop {
            let receiver = reciever.lock()
                .expect("Failed to grab the lock!")
                .recv();

            match receiver {
                Ok(task) => {
                    println!("Thread {} got the task& executing.", id);
                    task();
                    thread::sleep(Duration::from_millis(10));
                },

                Err(_) => {
                    println!("No got the task");
                    break;
                }
            }
        }
    });

    Self {
        id,
        thread
    }
}

這里,在每個循環中,我們都試圖獲得鎖并調用鎖上的recv(),以便我們可以獲得主線程發送的任務。

接下來,我們在ThreadPool中實現一個函數,將任務發送到不同的線程。

impl ThreadPool {
    fn new(size: usize) -> Self {
        // snip
    }

    fn execute<F>(&self, job: F)
    where
        F: FnOnce() + Send + 'static
    {
        let job = Box::new(job);

        self.sender.send(job)
            .expect("Failed to send the job to workers!");
    }
}

我們還需要創建一個函數,在ThreadPool結束時動態終止所有線程。簡單地說,我們必須手動實現ThreadPool的Drop特性,在那里我們將終止所有線程。

impl Drop for ThreadPool {
    fn drop(&mut self) {
        drop(self.sender.take());

        for worker in &mut self.workers {
            println!("Thread {} is shutting down.", worker.id);

            if let Some(thread) = worker.thread.take() {
                thread.join()..unwrap_or_else(|_| panic!("Failed to join the thread {}", worker.id));}
        }
    }
}

這里我們還必須刪除發送方,因為如果我們不這樣做,那么接收方將永遠循環。如果刪除發送者,那么接收者也會自動刪除,我們就可以成功地退出這個程序。

測試

main函數代碼如下:

fn main() {
    let pool = ThreadPool::new(5);

    for _ in 0..10 {
        pool.execute(|| println!("Doing something"));
    }
}

運行結果:

Thread 0 is shutting down.
Thread 0 got the job & executing.
Doing something
Thread 3 got the job & executing.
Doing something
Thread 1 got the job & executing.
Thread 2 got the job & executing.
Doing something
Thread 4 got the job & executing.
Doing something
Doing something
Thread 0 got the job & executing.
Doing something
Thread 4 got the job & executing.
Doing something
Thread 3 got the job & executing.
Doing something
Thread 2 got the job & executing.
Doing something
Thread 1 got the job & executing.
Doing something
No got the job
Thread 1 is shutting down.
No got the job
No got the job
No got the job
No got the job
Thread 2 is shutting down.
Thread 3 is shutting down.
Thread 4 is shutting down.


責任編輯:武曉燕 來源: coding到燈火闌珊
相關推薦

2022-03-28 08:31:29

線程池定時任務

2021-02-06 14:02:55

線程池Builder模式

2023-08-04 11:04:03

線程池項目開發

2023-07-05 07:48:04

線程池join關閉狀態

2022-04-26 08:41:38

Swift并發系統iOS

2023-12-29 09:38:00

Java線程池

2020-09-04 10:29:47

Java線程池并發

2025-07-03 07:10:00

線程池并發編程代碼

2020-12-10 07:00:38

編程線程池定時任務

2017-01-10 13:39:57

Python線程池進程池

2025-09-05 00:00:00

線程池Java并發編程

2019-08-16 11:16:25

Java程序員流程圖

2022-09-29 09:19:04

線程池并發線程

2022-11-09 09:01:08

并發編程線程池

2022-03-30 08:54:21

線程 Thread判斷線程池任務Java

2024-12-27 09:08:25

2023-11-29 16:38:12

線程池阻塞隊列開發

2021-09-11 15:26:23

Java多線程線程池

2020-02-17 16:28:49

開發技能代碼

2024-09-13 09:55:38

RustP2P網
點贊
收藏

51CTO技術棧公眾號

91欧美在线| 日韩欧美国产综合在线| 婷婷免费在线观看| www.久久久久久| 欧美色图激情小说| 亚洲成人高清在线| 少妇激情综合网| 国产精品秘入口18禁麻豆免会员| 91在线你懂的| 成人影视亚洲图片在线| 555夜色666亚洲国产免| 亚洲精品一品区二品区三品区| 看片网址国产福利av中文字幕| 亚洲精品一区在线| 中文字幕一区三区| 国产精品久久久久久久9999| 日本aaa视频| 国产白丝在线观看| 88国产精品视频一区二区三区| 色婷婷激情综合| 久久综合色一本| 国产精品23p| 1313精品午夜理伦电影| 欧美色播在线播放| 精品日产一区2区三区黄免费 | 国产99久久久久久免费看| 911精品国产| 在线中文字幕一区| 欧美久久久久久| 偷偷操不一样的久久| 日韩电影免费在线观看| 欧美在线看片a免费观看| 日韩欧美视频第二区| 日批视频免费观看| 在线日韩中文| 欧美白人最猛性xxxxx69交| 免费成人深夜夜行网站视频| 99久久精品国产色欲| 欧美在线亚洲| 亚洲精品久久久久久下一站| 黑人糟蹋人妻hd中文字幕| 九九热视频在线观看| 久久免费国产| 国产小视频国产精品| 美女网站色免费| 超碰最新在线| 成人午夜av电影| 91av在线播放| 国产精品免费无码| 日日夜夜天天综合| 综合自拍亚洲综合图不卡区| 成人在线观看av| 成人免费区一区二区三区| 九九热爱视频精品视频| 777午夜精品视频在线播放| 亚洲视频在线观看一区二区三区| 1024免费在线视频| 国产成人精品一区二区三区四区| 欧美性在线视频| 国产小视频你懂的| 国产精品sss在线观看av| 色成年激情久久综合| 宅男在线精品国产免费观看| 天堂网av2014| 九九视频精品免费| 97视频免费在线看| 精品视频第一页| 欧美黄色录像片| 久久精品久久久久电影| 丰满少妇一区二区三区| 2019中文亚洲字幕| 精品欧美aⅴ在线网站| 亚洲激情一区二区| 中文字幕日本在线| 亚洲欧洲日韩av| 激情成人开心网| аⅴ资源新版在线天堂| 波波电影院一区二区三区| 国产欧美日韩精品专区| 一级片一级片一级片| 国产伦理久久久久久妇女| 亚洲国产又黄又爽女人高潮的| 9.1成人看片| 狠狠色丁香婷婷综合影院| 欧美一二三区精品| 又色又爽又高潮免费视频国产| 91麻豆免费在线视频| 久久久久国产精品厨房| 国产精品久久久久久久免费大片| 亚洲综合免费视频| 小嫩嫩精品导航| 欧美激情中文字幕在线| 91狠狠综合久久久| 精品国产一区二区三区av片| 日韩av在线免费观看一区| 日本高清免费观看| 99蜜月精品久久91| 色哟哟精品一区| 国产精品自在自线| 91精品国产66| 日韩午夜激情视频| 黄色国产在线观看| 首页国产精品| 69影院欧美专区视频| 懂色av蜜臀av粉嫩av喷吹| 国产成人在线免费| 日本一区不卡| 狠狠狠综合7777久夜色撩人| 亚洲人成电影网站色mp4| 亚洲日本无吗高清不卡| 国产中文字幕在线观看| 亚洲乱码中文字幕| mm131午夜| 欧美电影免费观看| 日韩欧美中文第一页| 色呦色呦色精品| 图片一区二区| 91麻豆精品国产91久久久久 | 久久天天躁狠狠躁老女人| 一级片手机在线观看| 日韩高清影视在线观看| 亚洲国产精品推荐| jizzjizz日本少妇| 国产精品99久久| 久久精品国产电影| 黄色av一级片| 开心九九激情九九欧美日韩精美视频电影 | 亚洲人成电影网站色…| 又大又长粗又爽又黄少妇视频| www成人在线视频| 欧美xxxx老人做受| 色婷婷国产精品免| 欧美疯狂party性派对| 欧美又大粗又爽又黄大片视频| h片在线免费看| 盗摄精品av一区二区三区| 亚洲色图自拍| 欧美性片在线观看| 欧美精三区欧美精三区| 中文字幕乱妇无码av在线| 福利在线一区| 色综合男人天堂| 国产精品美女久久久久av爽| 国产成人av电影在线播放| 韩国成人一区| 欧美激情成人动漫| 欧美视频国产精品| 在线精品一区二区三区| 日本久久精品| 国产精品h在线观看| 国产精品一级视频| 成人午夜在线播放| 成人在线视频一区二区三区| 中文在线а√天堂| 欧美日韩美少妇| 四虎精品一区二区| 北条麻妃国产九九九精品小说| 51精品在线观看| 三区在线观看| 18欧美亚洲精品| 色一情一区二区三区| 久久精品国产68国产精品亚洲| 国产精品专区一| 欧美成年黄网站色视频| 亚洲五码中文字幕| 国产精品无码av无码| 久久91麻豆精品一区| 日本午夜人人精品| 国产免费av观看| 亚洲女爱视频在线| 亚洲av午夜精品一区二区三区| 韩国欧美一区| 成人国产精品久久久| 神马电影在线观看| 一区二区三区国产豹纹内裤在线| 激情五月开心婷婷| 国产欧美日韩影院| 成人黄色av免费在线观看| 香蕉成人app免费看片| 欧美视频日韩视频| 亚洲AV无码国产精品| 久久综合激情| 桥本有菜av在线| 欧美日韩亚洲国产| zzjj国产精品一区二区| 人妻丰满熟妇av无码区| 国产日韩v精品一区二区| 国产av国片精品| 日韩中文字幕| 精品国内自产拍在线观看| 国产av无码专区亚洲a∨毛片| 亚洲第一久久影院| 人人爽人人爽人人片| 国产乱理伦片在线观看夜一区| 亚洲精品免费在线看| 秋霞一区二区三区| 国产aⅴ夜夜欢一区二区三区 | 欧美激情一二三| 欧美日韩在线中文字幕| 亚洲国产综合人成综合网站| 老鸭窝一区二区| 国产一区二区三区国产| 一区二区在线观| 国内精品免费| 成人激情视频在线播放| 乱人伦视频在线| 日韩高清欧美高清| 亚洲无码精品国产| 亚洲成av人**亚洲成av**| 中国黄色片视频| 青草av.久久免费一区| 神马影院我不卡| 99久久亚洲国产日韩美女| 欧美精品999| 免费**毛片在线| 亚洲人成网7777777国产| a级片免费视频| 欧美最猛黑人xxxxx猛交| 国产亚洲精品女人久久久久久| 国产999精品久久久久久| 国产视频一区二区三区在线播放| 伊人久久婷婷| 精品一区二区日本| 国产精品一区二区精品视频观看| 免费91麻豆精品国产自产在线观看 | 人妻少妇精品无码专区二区| 日本欧美肥老太交大片| 久久99欧美| av免费不卡| 日韩精品在线影院| 中文字幕精品无| 中文字幕中文在线不卡住| www.久久国产| 99re成人在线| 麻豆一区二区三区视频| 亚洲一区二区三区免费在线观看| 欧美一区二区三区在线免费观看 | 青春草视频在线| 精品国产依人香蕉在线精品| 午夜视频在线观看网站| 欧美一区二区三区电影| 日本在线观看中文字幕| 久久久激情视频| 亚洲一区二区三区无码久久| 成人av网在线| 国产精品麻豆入口| 日韩电影免费在线观看网站| 黄色影视在线观看| 97精品一区二区| 亚洲人成人77777线观看| 欧美伦理在线视频| 日韩av电影免费在线观看| 亚洲自拍电影| 91久久在线观看| 亚洲黄色网址| 国产va免费精品高清在线观看| 亚洲国产福利| 国产精品久久久久久亚洲影视| 国产一区久久精品| 日韩精品视频在线免费观看| 开心激情综合网| 欧美日韩aaa| 一女二男一黄一片| 制服丝袜国产精品| 99久久精品国产一区色| 欧美成人a∨高清免费观看| 亚洲女人18毛片水真多| 亚洲成色777777女色窝| 91高潮大合集爽到抽搐| 7777精品伊人久久久大香线蕉经典版下载 | 国产高清视频网站| 日韩中文字幕av电影| 五月婷婷激情久久| 国产精品亚洲综合一区在线观看| 精品伦一区二区三区| 日日骚欧美日韩| 天天综合网日韩| 国产精品一区三区| 亚洲一区和二区| 国产人妖乱国产精品人妖| 亚洲精品久久一区二区三区777| 丁香啪啪综合成人亚洲小说| 18禁裸乳无遮挡啪啪无码免费| 国产精品―色哟哟| 国产精品九九九九九| 国产欧美日韩在线看| 男女做暖暖视频| 国产精品日韩成人| 亚洲AV成人无码精电影在线| 亚洲国产综合在线| 中国女人一级一次看片| 欧美视频中文在线看| 中文人妻熟女乱又乱精品| 欧美一级xxx| 精品美女视频在线观看免费软件| 日韩最新在线视频| 成年网站在线视频网站| 国产精品99导航| 成人知道污网站| 91九色单男在线观看| 成人性生交大片免费看96| 亚洲欧美99| 在线综合亚洲| 国产视频一视频二| 在线观看一区视频| 成人性生生活性生交12| 丁香啪啪综合成人亚洲小说| 欧美福利在线视频| 狠狠色香婷婷久久亚洲精品| 国产乱淫a∨片免费观看| 日韩成人在线免费观看| h片在线免费| 国产成人精品在线| 国产精品nxnn| 男女啪啪免费观看| 亚洲视频一区| 制服丝袜中文字幕第一页| www国产成人免费观看视频 深夜成人网 | 亚洲av成人片色在线观看高潮| 国产欧美一区二区三区鸳鸯浴| 日本熟妇毛耸耸xxxxxx| 欧美精品在线观看播放| 美女做暖暖视频免费在线观看全部网址91 | 精品久久久一区| 久久久久久久99| 在线成人av网站| 国产免费av高清在线| 国产一区二区三区视频在线观看| 波多一区二区| 亚洲已满18点击进入在线看片| 2021年精品国产福利在线| 亚洲人成网站在线观看播放| 日韩中文字幕亚洲一区二区va在线| 亚洲成人av免费在线观看| 一区二区三区四区高清精品免费观看 | 中国黄色录像片| 乱一区二区av| 山东少妇露脸刺激对白在线| 日韩欧美在线播放| 无码精品人妻一区二区三区影院| 亚洲福利影片在线| 污的网站在线观看| 亚洲在线观看视频网站| 98精品久久久久久久| 中文字幕国产免费| 国产精品美女久久久久久久 | av在线最新| 国产二区不卡| 影音国产精品| 蜜桃精品成人影片| 大桥未久av一区二区三区| 性xxxx视频播放免费| 68精品久久久久久欧美| 婷婷亚洲成人| 欧美aⅴ在线观看| 国产欧美精品在线观看| 亚洲一区二区三区高清视频| 日韩亚洲一区二区| 精品视频在线观看免费观看| 精品一区二区视频| 午夜在线精品偷拍| 一区二区三区四区免费| 欧美在线免费观看亚洲| 日本视频在线免费观看| 91在线看www| 影音先锋亚洲电影| 粉嫩av蜜桃av蜜臀av| 日本乱人伦aⅴ精品| 日本三级视频在线播放| 99久热re在线精品996热视频| 欧美日韩水蜜桃| 在线观看国产福利| 亚洲激情校园春色| 天天干在线观看| 国产精品美乳在线观看| 亚洲乱码在线| 手机看片福利日韩| 《视频一区视频二区| 亚洲精品视频网| 色婷婷久久av| 亚洲一区二区三区在线免费| 国产老熟妇精品观看| 国产拍揄自揄精品视频麻豆| 国产日韩在线观看一区| 69av成年福利视频| 欧美高清视频手机在在线| 精品人妻在线视频| 欧美中文字幕一区二区三区| 国语对白在线刺激| 日本精品视频一区| 国产成人av影院| 小泽玛利亚一区二区三区视频| 欧美精品一区三区| 九九视频免费观看视频精品| 色欲无码人妻久久精品| 色一情一乱一乱一91av| 在线观看男女av免费网址| 热re99久久精品国产99热| 粉嫩高潮美女一区二区三区| 在线观看国产小视频|