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