Wpis z mikrobloga

Hej,
Dopiero zaczynam przygodę z wątkami i chcę wrzucić cześć kodu do wątków aby go mocno przyspieszyć(za pomocą Rayon).

Stworzyłem póki co taki kod(który oczywiście się nie kompiluje)

self.imagestocheck.paritermut().map(|fileentry| {
let image = match image::open(file
entry.path.clone()) {
Ok(t) => t,
Err() => return, // Something is wrong with image
};
let dimensions = image.dimensions();

file
entry.dimensions = format!("{}x{}", dimensions.0, dimensions.1);
let hasher = HasherConfig::withbytestype::<[u8; 8]>().tohasher();

let hash = hasher.hash
image(ℑ);
let mut buf = [0u8; 8];
buf.copyfromslice(&hash.asbytes());

self.bktree.add(buf);
self.image
hashes.entry(buf).orinsertwith(Vec::::new);
self.imagehashes.getmut(&buf).unwrap().push(fileentry.clone());
});

Pastebin - https://pastebin.com/t8uRANEg

Problemem, jak pewnie na pierwszy rzut oka jest wiadome, jest użycie self wewnątrz domknięcia, przez co wywala dwa błędy -

error[E0500]: closure requires unique access to self but it is already borrowed

oraz

error[E0596]: cannot borrow self.image_hashes as mutable, as Fn closures cannot mutate their captured variables

W jaki sposób powinienem taką sytuację obsłużyć?

Jest jakiś prosty, dobry i aktualny poradnik do biblioteki Rayon?

#rustlang #programowanie #naukaprogramowania
  • 9
@qarmin: załozeniem rayona jest to, że zamieniac iter() na par_iter() i wszystko działa, więc raczej powinieneś ogarnąć jak się używa traitu Iterator w taki sposób, żeby nie mutować i jednocześnie osiągnąć co chcesz. Nie wiem, czy jest jakiś tutorial do tego, ta wiedza jest mocno przenośna z innych języków programowania
@Saly: @m504: A w jaki sposób mogę przerwać wykonywanie tych wątków?
Z innego wątku przekazuję sygnał wyłączenia, ale nie wiem jak go obsłużyć w Rayon.

Potrzebuję jak najszybciej, przerywając wątki lub czekając na ich zakończenie(nie wszystkich, tylko tych uruchomionych)

To zwracane przez funkcję bool określa czy funkcja została przerwana(false) czy też nie(true)

fn sortimages(&mut self, stopreceiver: Option<&Receiver<()>>) -> bool {
let hashmapmodification = SystemTime::now();

let vec
@DK13: while_some działa dobrze, ale z tego co widzę to tylko przerywa wykonywanie danych wątków.
Czy jest możliwe przy jej użyciu wyjście z zewnętrznej funkcji?
Nie widzę póki co żadnej metody na określenie czy wątki zostały przerwane przez użytkownika(funkcja while_some przerwała to) czy wszystkie zakończyły się poprawnie same.