← До фільтрів та технологій

← До списку лабораторних по Python

Python Лабораторна 14: ThreadPoolExecutor для IO bound задач

Технологія: Python

Номер лабораторної: 14 · Рівень: middle

Тема: Паралельні задачі через concurrent.futures

Повний опис / сценарій лабораторної:

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: опиши як би ти вимірював ефект від пулу потоків у прод сервісі.