Python 中 gevent.sleep() 和 time.sleep() 的区别

ris*_*sod 3 python time gevent

之间有什么区别gevent.sleep()time.sleep()Python?什么时候gevent.sleep()time.sleep()

Jas*_*den 9

(回想一下,gevent 在单个 Python 线程上运行多个 greenlet,将它们协作复用以执行协作多任务处理,在它们之间切换,因为它们会阻塞 IO。)

gevent.sleep()将把当前的 greenlet 交给 gevent hub,允许其他 greenlet 运行。time.sleep()不会屈服于枢纽;它将简单地挂起整个当前线程和所有可能想在其上运行的 greenlet。

另一方面,time.sleep将释放 Python GIL 并允许其他 Python 线程有机会运行(但仍会阻塞调用线程上的所有 greenlet),而gevent.sleep不会释放 GIL(除非没有其他 greenlet 准备好在调用线程上运行)线)。

如果您使用 对您的程序进行了猴子修补(足够早)gevent.monkey.patch_all(),则time.sleep只需成为 for 的别名,gevent.sleep就没有区别了。

在使用 gevent 的程序中,gevent.sleep通常建议使用猴子补丁或明确使用来代替time.sleep,否则您将无法获得合作 greenlets 的全部好处。

介绍性 gevent 文档中提供了更多详细信息,特别是有关事件循环、协作多任务和伪线程(greenlets)的部分。