ОБНОВЛЕНИЕ : возьмите это с крошкой соли, поскольку я не в курсе современных разработок по асинхронности Python, включая gevent и asyncio и don на самом деле не имеет серьезного опыта работы с асинхронным кодом.
Существует три распространенных подхода к асинхронному кодированию без потоков в Python:
Обратные вызовы - уродливо, но выполнимо, Twisted делает это хорошо.
Генераторы - хорошо, но требуют все ваш код, чтобы следовать стилю.
Использование реализации Python с реальными тасклетами - Stackless (RIP) и greenlet .
К сожалению, в идеале вся программа должна использовать один стиль, иначе все станет сложнее. Если у вас все в порядке с вашей библиотекой, предоставляющей полностью синхронный интерфейс, вы, вероятно, в порядке, но если вы хотите, чтобы несколько обращений к вашей библиотеке работали параллельно, особенно параллельно с другим асинхронным кодом, тогда вам нужен общее событие «реактор», способное работать со всем кодом.
Так что, если у вас есть (или вы ожидаете, что пользователь будет иметь) другой асинхронный код в приложении, принятие той же модели, вероятно, будет разумным.
Если вы не хотите разбираться во всей этой неразберихе, подумайте об использовании старых плохих тем. Они тоже безобразны, но работают со всем остальным.
Если вы действительно хотите понять, как сопрограммы могут помочь вам - и как они могут усложнить вам, «Любопытный курс по сопрограммам и параллелизму» Дэвида Бизли - хороший материал.
Greenlets может быть действительно самым чистым способом, если вы можете использовать расширение. У меня нет никакого опыта с ними, поэтому не могу сказать много.