Задать вопрос
@mkone112
Начинающий питонист.

Зачем нужны потоки?

За все время использования python так и не столкнулся с потоками. Решил почитать о них в книгах (Хеллман, Лутц, Рамальо) - вроде все понятно. Но вот где их применять на практике непонятно. Для io уже есть asyncio c aiofile, pyqt имеет свои обертки, и ниша threading мне не совсем ясна. Встречаю их использование в исходниках например фреймворков для обратной совместимости, но вот что с ними делать прикладному разработчику - не ясно.
P.S. вопрос в контексте использования мейнстрима в виде CPython, с учетом того что до вливания nogil в main еще далеко.
  • Вопрос задан
  • 730 просмотров
Подписаться 7 Простой 8 комментариев
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Потоки имеют смысл, когда тебе нужно быстро и дёшево выделить синхронный код в отдельную единицу исполнения без заморочек межпроцессной коммуникации. Иными словами:
- если выносимый код исполняется в течении длительного времени
- если нет возможности или желания переделывать выносимый код в корутину, а хочется оставить вытесняющую многозадачность
- если обмен данными с этой корутиной достаточно сложен, чтобы сериализация/десериализация не окупалась (хотя shared memory может помочь).
- если код не нагружен вычислениями (в связи с GIL)

В общем, потоки - это простое и ленивое решение.

Пример раз: асинхронное приложение, но с GUI без поддержки асинхронщины. GUI требует рабочий цикл, asyncio требует цикл-реактор, подружить их в одном потоке трудно, а вытащить GUI в отдельный процесс может потребовать заморочек с организацией взаимодействия. Проще запустить GUI-цикл в отдельном потоке и работать с ним там. (Хотя иногда есть хаки, позволяющие обновлять GUI в рамках "while True:" корутины.)

Пример два: асинхронная работа с файлами. Насколько я знаю, в питоне файлы чисто синхронные, а библиотеки для асинхронного доступа (типа aiofiles) под виндой "жульничают", выполняя синхронные операции как раз в отдельном потоке.
Да и в целом, если нужно выполнить долгий синхронный код в асинхронном приложении, вынос его в отдельный поток может оказаться наиболее удобным решением.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
например скрепер
создаете пул потоков и ждете пока все они отработают .

В общем случае это реализация фоновых задач.
Например в случае с интерактивной программой вы запускаете например формирование репорта и не дожидаясь читаете другой
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы