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.

  1. Znajdź tekst swojej ulubionej piosenki.
  2. Przekształć go w ciąg par: (numer wersu, wers).
  3. Losowo spermutuj ciąg par.
  4. Podziel otrzymany ciąg na dwie połowy.

Krok 2.

  1. Przygotuj kanał komunikacji asynchronicznej typu mpsc. Będziemy przesyłać nim pary z pierwszego kroku.
  2. 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.
  3. 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.

  1. Zamień pojedynczy kanał na dwa kanały. Skorzystaj z konstrukcji select w funkcji nasłuchującej.

Krok 4.

  1. Stwórz nowy kanał typu oneshot, którym można przesłać naszej funkcji sygnał do przerwania działania.
  2. 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).