2014-09-03 80 views
3

我正在尋找關於任務失敗的一些說明。據我瞭解,如果任務1產生任務2,則任務2是任務1的子任務。如果任務1失敗,它會在任務2後自動失敗並清理嗎?Rust中的失敗任務

例如,我開始AI/O任務的插座上,像這樣:

spawn(proc() { 
    start_new_socket(socket, socket_receiver) 
}); 

我們將調用任務1.在任務1,我產生另一個任務:

fn start_new_socket(socket: Socket, receiver: Receiver<Message>) { 

    // Write task 
    let mut stream_write = socket.stream.clone(); 
    spawn(proc() { 
     loop { 
      let msg = receiver.recv(); 
      msg.send(&mut stream_write).unwrap(); 
     } 
    }); 

    // Open up a blocking read on this socket 
    let mut stream_read = socket.stream.clone(); 
    loop {   
     let msg = Message::load(&mut stream_read).unwrap(); 
     match msg.payload { 
      Text(ptr) => { 
       let json_slice = (*ptr).as_slice(); 
       println!("Socket: {} recevied: {}", socket.id, json_slice); 
       parse_json(json_slice, socket.clone()); 
      } 
      Binary(ptr) => { 
       // TODO - Do awesome binary shit 
      } 
     } 
    }  
} 

如果任務1,start_new_socket由於EOF或流中的其他內容而失敗,那麼啓動的寫入任務是否也會失敗?

回答

1

我做過實驗,此代碼:

use std::io::Timer; 
use std::time::Duration; 

fn main() { 

    spawn(proc() { 
     let mut timer = Timer::new().unwrap(); 
     loop { 
      println!("I from subtask !"); 
      timer.sleep(Duration::seconds(1)); 
     } 
    }); 

    let mut other_timer = Timer::new().unwrap(); 
    other_timer.sleep(Duration::seconds(5)); 
    println!("Gonna fail...."); 
    other_timer.sleep(Duration::seconds(1)); 
    fail!("Failed !"); 
} 

輸出爲:

I from subtask ! 
I from subtask ! 
I from subtask ! 
I from subtask ! 
I from subtask ! 
Gonna fail.... 
I from subtask ! 
task '<main>' failed at 'Failed !', failing.rs:18 
I from subtask ! 
I from subtask ! 
I from subtask ! 
I from subtask ! 
I from subtask ! 
I from subtask ! 
^C 

所以顯然不是,子任務並不時的主要任務做失敗。

+1

很久以前,這些任務確實是分層次的,有很多選項可以控制失敗時的行爲。這個複雜的系統被一個更簡單,更平易近人的系統取代,任務之間沒有任何關係。 – barjak 2014-09-03 18:15:57