Разница между gevent.sleep () и time.sleep () в Python - PullRequest
1 голос
/ 28 марта 2019

В чем разница между gevent.sleep() и time.sleep() в Python?Когда gevent.sleep() и time.sleep()?

1 Ответ

3 голосов
/ 29 марта 2019

(Напомним, что gevent запускает несколько гринлетов в одном потоке Python, совместно их мультиплексируя для выполнения совместной многозадачности, переключаясь между ними, как если бы они блокировали ввод-вывод.)

gevent.sleep() выдаст текущий гринлет в концентратор gevent, что позволит запускать другие гринлеты. time.sleep() не уступит хабу; он просто приостановит весь текущий поток и всех гринлетов, которые могли бы работать на нем.

С другой стороны, time.sleep выпустит GIL Python и предоставит возможность другим потокам Python запускать (но все еще блокирует все гринлеты в вызывающем потоке), тогда как gevent.sleep не освобождает GIL (если нет нет других гринлетов, готовых работать в вызывающей ветке).

Если вы запатентовали вашу программу (достаточно рано), используя gevent.monkey.patch_all(), тогда time.sleep просто становится псевдонимом для gevent.sleep, и нет никакой разницы.

В программе, использующей gevent, monkey patching или явно использующей gevent.sleep, обычно рекомендуется вместо time.sleep, в противном случае вы не сможете воспользоваться всеми преимуществами кооперативных гринлетов.

Более подробная информация представлена ​​в вводной документации Gevent , в частности, в разделах о цикле событий, совместной многозадачности и псевдопотоках (гринлетах).

...