Почему gevent.sleep (0) не дает результата, для чего требуется ненулевое значение? - PullRequest
0 голосов
/ 06 ноября 2019

Попытка проверить, обслуживает ли мое приложение uWSGI-> py2.7-> Flask-> gevent запросы одновременно.

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

Этот совет в фактическом фактическом документе gevent.sleep действительно объясняет, как ненулевое значениеработает, и для меня имеет смысл, почему это работает:

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

Что я делаю не понимаю, почему sleep (0) не работает, и что фактически делает sleep (0). Что же делает gevent в sleep (0), чтобы решить, на какой гринлет переключиться в контекст? И если оно не предназначено или не способно включить режим сна (0), в чем смысл этого значения по умолчанию и почему так много руководств в Интернете говорят, что делают это именно так?

1 Ответ

0 голосов
/ 14 ноября 2019

GEVENT работает так. У вас есть один (синхронный) цикл действий. Если одна из этих вещей связана с IO, то gevent может перейти к следующему элементу в очереди, пока эта система ожидает, пока IO вернет результат. Если функция интенсивно использует процессор, то цикл GEVENT будет ожидать перехода к другим элементам, пока этот процесс не завершится. Цикл вернется назад и проверит, завершен ли этот ввод-вывод.

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

GEVENT отлично подходит для веб-ориентированного или связанного с вводом-выводом (SQL, Network, Files) и плохо подходит для объектов с интенсивным использованием ЦП, где фактическая многопоточность даст лучшие результаты.

Возможно, ваши функции основаны на процессоре и, следовательно, не уступают следующему элементу в цикле.

...