Блокирует ли проблема с гринлетами?
Я понимаю, что блокировка кода - это грех, когда речь заходит о циклах событий (например, NodeJS), но как быть с гринлетами (которые, я считаю, являются зелеными нитями)? Есть ли проблема с запуском кода, который вызывает функции блокировки?
2 ответа
Сами гринлеты без цикла событий, предоставляемые gevent, очень примитивны. Блокирующий вызов из одного гринлета блокирует все гринлеты, поскольку одни только гринлеты не имеют возможности выполнять операции ввода-вывода и не имеют планировщика. Патч Gevent для ввода-вывода сокетов и файлов, как правило, достаточно, чтобы включить неблокирующий ввод-вывод даже для баз данных, при условии, что библиотека баз данных написана на python и использует сокеты. Или поочередно вы можете исправить библиотеку самостоятельно.
Вызов функции, которая блокирует цикл обработки событий, является, конечно, проблемой, потому что другие зеленые потоки будут ожидать завершения этой функции.
Но если вы используете Gevent, вы можете вызывать блокирующие функции. Gevent исправляет распространенные функции блокировки Python. Запишите это в начале программы, и Gevent исправит все функции блокировки:
от gevent import monkey monkey.patch_all()