Laboratoria: 18 XII¶
Celem zajęć jest zapoznanie się z podstawami asynchroniczności w języku Rust.
Używać będziemy biblioteki tokio: https://tokio.rs/.
Krok 1.¶
- Znajdź tekst swojej ulubionej piosenki.
- Przekształć go w ciąg par: (numer wersu, wers).
- Losowo spermutuj ciąg par.
- Podziel otrzymany ciąg na dwie połowy.
Krok 2.¶
- Przygotuj kanał komunikacji asynchronicznej typu mpsc. Będziemy przesyłać nim pary z pierwszego kroku.
- Odpal dwa asynchroniczne procesy: każdy z nich powinien otrzymać połowę zaindeksowanych wersów oraz jedną z połówek kanału (tę do nadawania - trzeba będzie ją sklonować). W losowych odstępach czasu, kolejny wers powinien zostać wysłany kanałem.
- Napisz asynchroniczną funkcję, która otrzymuje połówkę kanału (do nasłuchu) i nasłuchuje nowych wersów. Na bieżąco funkcja powinna wypisywać na standardowe wyjście wersy w poprawnej kolejności. Wersy powinny być wypisywane możliwie najszybciej (bez zbędnego buforowania).
Krok 3.¶
- Zamień pojedynczy kanał na dwa kanały. Skorzystaj z konstrukcji select w funkcji nasłuchującej.
Krok 4.¶
- Stwórz nowy kanał typu oneshot, którym można przesłać naszej funkcji sygnał do przerwania działania.
- Przetestuj rozwiązanie.
Zadanie dodatkowe (wielowątkowość)¶
Naszym zadaniem jest zapisanie do pliku pierwszych 10 9 potęg liczby 5
modulo 1129761680720641506216787528648529377
.
Każda potęga to u128
, zatem potrzebne będzie nam ~16GB pamięci na dysku.
Ponieważ wszystkie dane nie zmieszczą się w RAMie, na bieżąco należy zapisywać częściowe wyniki w paczkach (np. po ~10MB).
Przetestuj wydajność rozwiązań:
- sekwencyjnego,
- równoległego (wątki) korzystając z biblioteki standardowej
- równoległego (wątki) korzystając z biblioteki
rayon
(<https://github.com/rayon-rs/rayon>__)
Do jednoczesnego dostępu do różnych części pliku sugeruję skorzystać z biblioteki https://docs.rs/memmap.
Do pomiaru czasu proponuję skorzystać z cargo bench
.
Do testowania poprawności wyników proponuję pracować na mniejszej ilości potęg (np. 10 3).