← До списку лабораторних по Python
Повний опис / сценарій лабораторної:
Meta: навчитися запускати декілька IO bound задач паралельно через ThreadPoolExecutor.
Krok 1. Створити файл src/app/pool14.py.
Komandi: cd ~/python_lab1/src; touch app/pool14.py
Krok 2. Додати функцію яка імітує IO операцію.
Komanda: printf "import time
from concurrent.futures import ThreadPoolExecutor, as_completed
def io_task(name: str, delay: float) -> str:
time.sleep(delay)
return f"task {name} done after {delay}"
if __name__ == "__main__":
tasks = [("a", 1.0), ("b", 2.0), ("c", 1.5)]
with ThreadPoolExecutor(max_workers=3) as ex:
futures = [ex.submit(io_task, n, d) for n, d in tasks]
for f in as_completed(futures):
print(f.result())
" > app/pool14.py
Krok 3. Запустити скрипт і подивитися порядок виводу.
Komanda: export PYTHONPATH=$(pwd); time python app/pool14.py
Krok 4. Порівняти час з послідовним виконанням.
Poyasnennya: напиши версію без ThreadPoolExecutor і виміряй час.
Krok 5. Додати обробку винятків у задачах.
Poyasnennya: використовуй try except всередині io_task або при обробці futures.
Krok 6. Змінити max_workers і подивитися вплив на швидкість.
Krok 7. Обговорити коли пул процесів через ProcessPoolExecutor буде кращим варіантом.
Krok 8. Занотувати обмеження багатопоточності через глобальний інтерпретаторний замок для CPU bound коду.
Krok 9. Продумати приклад реальної утиліти яка одночасно обробляє багато файлів або HTTP запитів.
Krok 10. Mini zvit.
Zavdannya: опиши як би ти вимірював ефект від пулу потоків у прод сервісі.