2014-09-03 15 views
3

Я ищу некоторые пояснения при сбое задачи. Как я понимаю, если задача 1 порождает задачу 2, задача 2 является дочерней задачей 1. Если задача 1 терпит неудачу, она автоматически терпит неудачу и очистку после задачи 2?Неудачные задачи в ржавчине

К примеру, я начинаю 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

Смежные вопросы