2015-07-13 22 views
6

Rust có cách "đóng" kênh, similar to what is available in Go không?Đóng kênh, như ở mục

Ý tưởng là lặp qua kênh (nhận liên tục) cho đến khi kênh cho biết rằng kênh sẽ không tạo thêm bất kỳ giá trị nào.

use std::sync::{Arc, Mutex}; 
use std::thread; 
use std::sync::mpsc; 

fn main() { 
    let data = Arc::new(Mutex::new(0u32)); 
    let (tx, rx) = mpsc::channel::<u32>(); 
    { 
     let (data, tx) = (data.clone(), tx.clone()); 
     thread::spawn(move || { 
      for _ in 0..10 { 
       let mut data = data.lock().unwrap(); 
       *data += 1; 
       tx.send(*data).unwrap(); 
      } 
      // *** How could I close the channel here, to signal the work is done? 
     }); 
    } 

    // *** How can I detect a closed channel here? Pattern matching? 
    for _ in 0..10 { 
     let x = rx.recv().unwrap(); 
     println!("{}", x); 
    } 
} 
+1

Bạn có mã nào đại diện cho những gì bạn đang cố gắng làm không? – tadman

+0

@tadman [A khá ngớ ngẩn] Ví dụ đã thêm – jocull

+1

tài liệu đã trả lời imo này: https://doc.rust-lang.org/nightly/std/sync/mpsc/struct.Sender.html#method.send Bỏ qua ' tx' (vì nó xảy ra sau vòng lặp for vì phạm vi kết thúc) sẽ làm cho 'rx' trả về' Err' thay vì 'Ok' trên' recv' tiếp theo. Sau đó, bạn có thể so khớp mẫu trên kết quả của 'recv' để kiểm tra' Ok' hoặc 'Err'. –

Trả lời

13

Kênh này đóng khi tất cả người gửi đã bỏ. Trong mã của bạn, bạn sao chép và cung cấp một cái cho mỗi luồng, những giọt này sẽ xuất hiện khi chuỗi kết thúc. Người gửi cuối cùng nằm trong chủ đề chính và bạn nên thả nó ngay khi tất cả các chủ đề đã được sinh ra: drop(tx).

Cuối cùng, cách dễ nhất để nhận là số này, saudrop(tx).

for elt in rx { 
    /* */ 
} 

Vòng lặp này kết thúc khi kênh được đóng lại.

+0

Chính xác những gì tôi cần! Đây là một ví dụ làm việc đơn giản trên sân chơi: http://is.gd/jfSQD2 – jocull

+1

Đây là một ví dụ về một hàm tạo đơn giản. http://is.gd/DQb0Ot – jocull

+0

Đó là một cách tuyệt vời nhưng lãng phí để lặp lại (đó cũng là một chuỗi hệ điều hành), vì vậy tôi đã không thấy nhiều điều đó trong Rust. – bluss

Các vấn đề liên quan