在线程之间传递 hashmap 的通道 |陷入循环 |锈

Channels for passing hashmap between threads | stuck in loop | Rust

我正在为网站 Exercism in rust 解决一个问题,我主要尝试同时计算某些文本中不同字母出现的次数。我通过在线程之间传递哈希图来做到这一点,并且不知何故处于某种无限循环中。我认为问题出在我对接收器的处理上,但我真的不知道。请帮忙。

use std::collections::HashMap;
use std::thread;
use std::sync::mpsc;
use std::str;

pub fn frequency(input: &[&str], worker_count: usize) -> HashMap<char, usize> {
   
   // Empty case 
   if input.is_empty() {
       return HashMap::new();
   }

   // Flatten input, set workload for each thread, create hashmap to catch results
   let mut flat_input = input.join("");
   let workload = input.len() / worker_count;
   let mut final_map: HashMap<char, usize> = HashMap::new();

   
   let (tx, rx) = mpsc::channel();
   for _i in 0..worker_count {
       let task = flat_input.split_off(flat_input.len() - workload);
       let tx_clone = mpsc::Sender::clone(&tx);

       
       // Separate threads ---------------------------------------------
       thread::spawn(move || {
          let mut partial_map: HashMap<char, usize> = HashMap::new();
          for letter in task.chars() {
              match partial_map.remove(&letter) {
                  Some(count) => {
                      partial_map.insert(letter, count + 1);
                  },
                  None => {
                      partial_map.insert(letter, 1);
                  }
              }
          }
          tx_clone.send(partial_map).expect("Didn't work fool");
       });
       // --------------------------------------------------  
       
   }
   
   // iterate through the returned hashmaps to update the final map
   for received in rx {
       for (key, value) in received {
           match final_map.remove(&key) {
               Some(count) => {
                   final_map.insert(key, count + value);
               },
               None => {
                   final_map.insert(key, value);
               }  
           }
       }
   }
   
   return final_map;
}

迭代接收者 rx 将在发送者存在时阻止新消息。克隆到线程中的那些将在完成后退出范围,但原始发件人 tx 仍在范围内。

您可以手动删除 tx 使其超出范围:

for _i in 0..worker_count {
    ...
}

std::mem::drop(tx); // <--------

for received in rx {
    ...
}