Может ли одна небольшая часть приложения использовать gevent или все приложение должно переключаться?

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

Я хочу показать определенную часть состояния приложений в режиме реального времени с помощью веб-сокетов. Я изучил Flask-Sockets, в котором используются gevent и gunicorn.

Должна ли все мое приложение использовать модель, управляемую событиями, или я могу оставить остальную часть кода блокировки такой, какая она есть? (Похоже, что базовые тесты содержат как блокирующий, так и событийный код, но есть ли какие-либо предостережения и придется ли мне переписывать большую часть кода?)

Я не нашел ответа в Google и проверил домашние страницы gevent и gunicorn и часто задаваемые вопросы. Я спрашиваю, потому что знаю, что gevent может быть реализован путем исправления существующих библиотек.


person stephenbez    schedule 25.11.2013    source источник


Ответы (2)


Это не рекомендуется. В документах ничего не говорится о гарантиях безопасности потоков между тем, что делается в гринлетах, и тем, что делается в обычных потоках. Похоже, такое поведение не поддерживается, и в Интернете не так много информации о проблемах, с которыми вы столкнетесь.

Вы увидите странное поведение и ошибки при взаимодействии между ними.

Например, если вы помещаете что-то в gevent.Queue из обычного потока, может потребоваться много секунд, чтобы поток gevent заметил, что там что-то есть.

person stephenbez    schedule 19.12.2013

Вы можете выборочно исправить обезьяну, как показано здесь. Это может сработать для вас.

person fthinker    schedule 03.12.2013
comment
Если я выполню gevent.monkey.patch_socket, заменит ли это все сокеты в системе версией gevent (в идеале — нет)? Документы на связанной странице не дают ясности. Кроме того, если у меня есть gevent.socket, могу ли я получить к нему доступ из потока, отличного от gevent? - person stephenbez; 06.12.2013