Python асинхронные и связанные с процессором задачи?

Недавно я работал над любимым проектом на Python с использованием колбы. Это простая вставка с поддержкой подсветки синтаксиса на стороне сервера с помощью фрагментов. Поскольку это дорогостоящая задача, я делегировал подсветку синтаксиса в очередь задач сельдерея, и в обработчике запросов я жду его завершения. Излишне говорить, что это не более чем облегчает использование ЦП другим работником, поскольку ожидание результата все еще блокирует соединение с веб-сервером. Несмотря на то, что мои инстинкты подсказывали мне избегать преждевременной оптимизации, такой как чума, я все еще не мог не смотреть на асинхронность.

асинхронный

Если в последнее время вы следите за веб-разработкой на python, вы наверняка видели, что асинхронность есть везде. То, что делает async, возвращает кооперативную многозадачность, то есть каждый «поток» решает, когда и где уступить другому. Этот не вытесняющий процесс более эффективен, чем потоки ОС, но все же имеет свои недостатки. На данный момент существует два основных подхода:

многозадачность в стиле события / обратного вызовасопрограммы

Первый обеспечивает параллелизм через слабосвязанные компоненты, выполняемые в цикле событий. Хотя это безопаснее в отношении условий гонки и обеспечивает большую согласованность, оно значительно менее интуитивно понятно и сложнее в кодировании, чем упреждающая многозадачность.

Другое - более традиционное решение, более близкое к стилю многопоточного программирования, программисту приходится только вручную переключать контекст. Несмотря на большую склонность к гоночным условиям и взаимоблокировкам, он обеспечивает простое решение.

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

Несмотря на название, это может быть применено кCPU-оценка Задачи тоже, которые могут быть делегированы другому работнику (поток, процесс и т. д.), а затем неблокирующе ожидал, чтобы дать. В идеале эти задачи должны быть написаны асинхронно-дружественным образом, но в действительности это подразумевало бы разделение кода на достаточно маленькие куски, которые не нужно блокировать, предпочтительно без разброса переключений контекста после каждой строки кода. Это особенно неудобно для существующих синхронных библиотек.

Из-за удобства я остановился на использовании gevent для асинхронной работы и задавался вопросом, как справляться с задачами, связанными с ЦП, в асинхронной среде (с использованием futures, celery и т. Д.?).

Как использовать асинхронные модели выполнения (в данном случае gevent) с традиционными веб-фреймворками, такими как flask? Каковы некоторые общепринятые решения этих проблем в python (фьючерсы, очереди задач)?

РЕДАКТИРОВАТЬ: Чтобы быть более конкретным - Как использовать Gevent с колбой и как решать задачи, связанные с CPU в этом контексте?

EDIT2: Учитывая, что в Python есть GIL, который предотвращает оптимальное выполнение многопоточного кода, остается только опция многопроцессорной обработки, по крайней мере, в моем случае. Это означает либо использованиеconcurrent.futures или какой-либо другой внешний сервис, занимающийся обработкой (может открыть двери даже для чего-то не зависящего от языка). Какими бы в этом случае были некоторые популярные или часто используемые решения с помощью gevent (то есть сельдерей)? - лучшие практики

Ответы на вопрос(2)

Ваш ответ на вопрос