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:
- Pracovníci, kteří nemají co dělat, spí.
- Metoda
computevrátíFuturea na nic nečeká, i když všichni pracovníci něco dělaji. - Metoda
derefuspí volajícího, pokud hodnota ješte není vypočtena. - Jakmile je vypočtena hodnota pro
Future, probudí se všichni uspaní naderefa všechny dalšíderefuž 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()