Какие основные отличия между корутинами и потоками в Python и в каких ситуациях их предпочтительно использовать?
Answer from AI
sobes.tech AI
Корутины и потоки в Python отличаются по способу организации параллелизма:
-
Потоки (threads) — это системные потоки ОС, которые могут выполняться параллельно на разных ядрах процессора. Однако из-за GIL (Global Interpreter Lock) в CPython одновременно выполняется только один поток Python-кода, что ограничивает параллелизм в CPU-bound задачах. Потоки хорошо подходят для I/O-bound задач (например, сетевые операции), где много времени уходит на ожидание.
-
Корутины (coroutines) — это легковесные функции, которые могут приостанавливать своё выполнение (yield/await) и передавать управление обратно циклу событий (event loop). Они реализуют кооперативную многозадачность и не требуют переключения контекста ОС, что делает их очень эффективными для большого числа I/O-bound операций.
Когда использовать:
- Для задач с интенсивным вводом-выводом и большим количеством одновременных операций (например, веб-серверы, сетевые клиенты) предпочтительны корутины (asyncio).
- Для задач, требующих параллельного выполнения CPU-интенсивных операций, лучше использовать процессы (multiprocessing) или внешние библиотеки, так как потоки ограничены GIL.
Пример корутины с asyncio:
import asyncio
async def fetch_data():
await asyncio.sleep(1) # имитация I/O
return 'data'
async def main():
result = await fetch_data()
print(result)
asyncio.run(main())