为什么gevent.sleep(0)不产生,需要一个非零值?

问题描述 投票:0回答:1

尝试测试我的uWSGI-> py2.7-> Flask-> gevent应用程序是否正在同时处理请求。

[许多指南说,'gevent.sleep(0)'是您需要执行的操作,以使'线程'产生。对于我的情况,它不起作用。经过反复试验,我意识到我必须放置一个非零的睡眠值才能使运行中的greenlet产生。

[实际gevent.sleep文档中的提示确实说明了非零值的工作原理,并且对我为什么起作用的原因很有意义:

提示在当前实现中,值0(默认值)表示对任何其他可运行的greenlet都执行,但是可以在事件循环循环之前再次调度此greenlet(在极端情况下,与0可以阻止准备好进行I / O的Greenlet计划一段时间(一小段时间);另一方面,大于0的值将延迟运行此greenlet直到循环的下一次迭代。

我做什么not明白了,为什么sleep(0)起作用not以及sleep(0)实际在做什么。在sleep(0)上,gevent如何确定上下文切换到哪个greenlet?如果不打算或无法打开sleep(0),那么默认值的意义何在?为什么互联网上有那么多指南说要这样做?

python uwsgi gevent
1个回答
0
投票

GEVENT的工作原理是这样的。您要做的事情只有一个(同步)循环。如果其中之一受IO约束,则gevent可以移至队列中的下一项,而该系统等待IO返回结果。如果该函数占用大量CPU,则GEVENT循环将等待移至其他项目,直到该过程完成。循环将返回,并检查该IO是否已完成。

这就是为什么GEVENT看起来是异步的,但仍然不是多线程或多进程的。但是,由于这些线程不是实际的OS线程,因此它们的重量很轻,并且每秒可以排队数千个作业。

GEVENT非常适合Web驱动或IO绑定(SQL,网络,文件),而对CPU密集型对象不利,因为实际线程将产生更好的结果。

可能是您的函数基于CPU,因此不会屈服于循环中的下一项。

© www.soinside.com 2019 - 2024. All rights reserved.