gevent.sleep()
中的time.sleep()
和Python
有什么区别?什么时候gevent.sleep()
和time.sleep()
?
答案 0 :(得分:1)
(回想一下,gevent在单个Python线程上运行多个greenlet,以协作方式对其进行多路复用以执行协作式多任务处理,并在它们之间进行切换以阻止IO。)
gevent.sleep()
会将当前的greenlet生成到gevent hub,从而允许其他greenlet运行。 time.sleep()
不会屈服于中心;它将简单地挂起整个当前线程和可能在其上运行的 all greenlets。
另一方面,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中提供了更多详细信息,特别是有关事件循环,协作式多任务处理和伪线程(greenlet)的部分。