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
compute
vrátíFuture
a na nic nečeká, i když všichni pracovníci něco dělaji. - Metoda
deref
uspí volajícího, pokud hodnota ješte není vypočtena. - Jakmile je vypočtena hodnota pro
Future
, probudí se všichni uspaní naderef
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()