לדלג לתוכן

פתרון חלוקת עבודה מושאלת

הקוד הבא מחלק קריאה בלבד בין תהליכונים ומחזיר סכום מכל אחד. הטווח האחרון יכול להיות קצר יותר, ואין דרישה שהאורך יתחלק בגודל החלק.

fn main() {
    let values: Vec<u64> = (1..=11).collect();
    let total = std::thread::scope(|scope| {
        let handles: Vec<_> = values.chunks(3)
            .map(|chunk| scope.spawn(move || chunk.iter().sum::<u64>())).collect();
        handles.into_iter().map(|h| h.join().expect("worker panic")).sum::<u64>()
    });
    assert_eq!(total, 66);
}

במוצר נחליף את expect בהחזרת סוג תוצאה שמבדיל בין סכום תקין לכשל עובד, ונאסוף את יתר העובדים בהתאם למדיניות. הפלת ידית אינה שולחת בקשת עצירה, ולכן העובד ממשיך להחזיק את מה שהועבר אליו עד שיסיים או ייכשל. ביטול דורש ערוץ או מצב שהעובד אכן בודק.