Вопрос проверяет знание механизмов параллельного выполнения в Python, включая потоки, процессы и асинхронность, что важно для оптимизации производительности.
Python предлагает несколько подходов для параллельного выполнения кода, каждый из которых подходит для разных сценариев. Выбор зависит от типа задач: I/O-bound (ожидание ввода-вывода) или CPU-bound (вычисления).
Модуль threading позволяет запускать несколько потоков в одном процессе. Из-за GIL (Global Interpreter Lock) только один поток может выполнять байт-код Python в любой момент времени. Поэтому threading эффективен только для I/O-bound задач, где потоки ждут ответа от сети или диска.
import threading
import time
def io_task(name):
print(f"Task {name} started")
time.sleep(1) # имитация I/O
print(f"Task {name} finished")
threads = []
for i in range(5):
t = threading.Thread(target=io_task, args=(i,))
threads.append(t)
t.start()
for t in threads:
t.join()Модуль multiprocessing создает отдельные процессы, каждый со своим GIL. Это позволяет использовать все ядра CPU для вычислений. Подходит для CPU-bound задач, но требует больше памяти и накладных расходов на межпроцессное взаимодействие.
from multiprocessing import Process
def cpu_task(n):
return sum(i*i for i in range(n))
if __name__ == "__main__":
processes = []
for i in range(4):
p = Process(target=cpu_task, args=(10**7,))
processes.append(p)
p.start()
for p in processes:
p.join()Asyncio использует кооперативную многозадачность в одном потоке с помощью корутин и event loop. Идеально для большого количества I/O операций (например, веб-скрапинг или работа с базами данных). Код пишется с ключевыми словами async/await.
import asyncio
async def fetch_data(url):
print(f"Fetching {url}")
await asyncio.sleep(1) # имитация запроса
return f"Data from {url}"
async def main():
tasks = [fetch_data(f"http://example.com/{i}") for i in range(5)]
results = await asyncio.gather(*tasks)
print(results)
asyncio.run(main())Вывод: Для I/O-bound задач используйте asyncio (если нужна высокая производительность) или threading (если проще). Для CPU-bound задач применяйте multiprocessing. Asyncio особенно полезен для веб-серверов и сетевых приложений, где тысячи соединений обрабатываются эффективно.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
Python
Node.js
Ключевые слова
Подпишись на Python Developer в телеграм