10. cvičení - Future object

Úkoly

(Bodovaný) Naprogramujte objekt reprezentující pracovní sílu, které budeme moci zadávat úkol ve formě funkce bez argumentů a dostaneme objekt, ve kterém se někdy objeví vysledek. Naprogramujte třídu Labour, která bude mít metody set_worker_count a compute. Metoda set_worker_count pro číslo vytvoří daný počet pracovníků (vláken), kteří budou čekat na vyzvednutí funkce k vypočtení. Metoda compute pak bude brát funkci bez argumentu a vratí objekt Future, který má metodu deref, která vrátí vypočtenou hodnotu. Vašim úkolem je zajistit platnost těchto pravidel:

  1. Pracovníci, kteří nemají co dělat, spí.
  2. Metoda compute vrátí Future a na nic nečeká, i když všichni pracovníci něco dělaji.
  3. Metoda deref uspí volajícího, pokud hodnota ješte není vypočtena.
  4. Jakmile je vypočtena hodnota pro Future, probudí se všichni uspaní na deref a všechny další deref už nemůžou nikoho uspat.
    
    def factorial(n):
        if n == 0:
            return 1
        else:
            return n * factorial(n - 1)

    def fibonacci(n):
        if n <= 1:
            return n
        else:
            return fibonacci(n - 1) + fibonacci(n - 2)

    def worker_function():
        return factorial(1000)

    labour = Labour()
    labour.set_worker_count(5)

    factorial_future = labour.compute(worker_function)
    large_factorial = factorial_future.deref()

    fibonacci_future = labour.compute(lambda: fibonacci(50))
    large_fibonacci = fibonacci_future.deref()