🔹 Когда лучше threading, а когда asyncio? 🔸 Без конкурентности (concurrency) приложение простаивает при I/O: клиенты ждут, throughput падает. threading и asyncio дают параллельность (parallelism) разными способами, чтобы не блокировать процесс. 🔸 threading — это OS‑потоки. Простая модель: запустил функцию в Thread. Хорошо для блокирующего I/O и когда есть C‑расширения, которые освобождают GIL (Global Interpreter Lock). 🔸 GIL (Global Interpreter Lock) мешает реальной параллельности Python‑байткода: для CPU‑bound задач threading не даст ускорения — используйте multiprocessing или C/нативные библиотеки. 🔸 asyncio — одна нить + event loop. Экономит память и масштабируется при тысячах одновременных I/O, но требует async‑совместимых библиотек и другой архитектуры кода. import asyncio async def task(n): await asyncio.sleep(1) return n async def main(): await asyncio.gather(*(task(i) for i in range(1000))) asyncio.run(main()) 📚 Для many I/O — asyncio; для простоты и C‑кодa — thr