gevent.sleep()
和time.sleep()
在Python
有什么区别?什么时候到gevent.sleep()
和time.sleep()
?
(回想一下,gevent在一个Python线程上运行多个greenlet,协同复用它们以执行协作式多任务处理,在它们之间进行切换,因为它们会阻止IO。)
gevent.sleep()
将把当前的greenlet送到gevent hub,让其他greenlets运行。 time.sleep()
不会屈服于枢纽;它将简单地挂起整个当前线程以及可能想在其上运行的所有greenlet。
另一方面,time.sleep
将释放Python GIL并允许其他Python线程运行(但仍然阻止调用线程上的所有greenlet),而gevent.sleep
不释放GIL(除非没有其他greenlet准备运行调用线程)。
如果你使用gevent.monkey.patch_all()
对你的程序进行猴子修补(足够早),那么time.sleep
只是成为gevent.sleep
的别名而且没有区别。
在使用gevent的程序中,通常建议使用猴子修补或明确使用gevent.sleep
而不是time.sleep
,否则您将无法获得合作greenlet的全部好处。
更多细节在the introductory gevent documentation中提供,特别是关于事件循环,协作式多任务和伪线程(greenlets)的部分。