Теория
Теория о процессах, потоках, конкурентности, параллелизме и т.д.: Asyncio. Мэтью Фаулер.
Кооперативная многозадачность – задачи сами определяют, когда передать управление. Если зависнет одна задача, полетит вся система.
Вытесняющая многозадачность – планировщик ОС сам выделяет время задачам поочередно. Высокие затраты на переключение контекста, зато если зависнет одна задача, остальные будут выполняться.
threading
Example: cataas.py.
threads = []
for i in range(CATS_QTY):
thread = threading.Thread(
target=download_image,
args=(
CAT_URL,
OUT_PATH.format(uuid.uuid4()),
),
)
thread.start()
threads.append(thread)
[thread.join() for thread in threads]
Также можно создать класс, унаследованный Thread
, и переопределить в нём метод run()
. Пример – Решение задачи про философов при помощи Lock
.
threading.Lock
Для разграничения доступа к данным. Поддерживает контекстный менеджер.
threading.Semaphore
Семафор похож на блокировку в том смысле, что его можно захватывать и освобождать, а основное отличие заключается в том, что захватить семафор можно не один раз, а несколько, – максимальное число задаем мы сами. Под капотом семафор следит за этим пределом; при каждом захвате предел уменьшается, а при каждом освобождении увеличивается. Как только счетчик обращается в нуль, дальнейшие попытки захватить семафор блокируются, пока кто-то не выполнит операцию освобождения, которая увеличит счетчик. Можно считать, что блокировка – частный случай семафора с пределом 1.
multiprocessing
Example: cataas.py.
processes = []
for i in range(CATS_QTY):
process = multiprocessing.Process(
target=download_image,
args=(
CAT_URL,
OUT_PATH.format(uuid.uuid4()),
),
)
process.start()
processes.append(process)
[process.join() for process in processes]
Задача об обедающих философах
Каждый философ может есть только двумя вилками. А пока он держит одну, находится в размышлениях. На иллюстрации приведена ситуация, когда каждый философ взял левую вилку, что создало deadlock.
Решение задачи при помощи
Lock
.
📂 Operating Systems | Последнее изменение: 11.08.2024 10:26