【发布时间】:2014-04-02 22:19:47
【问题描述】:
我来自 Node.js,其中 https://github.com/caolan/async 等库允许异步迭代数组而不阻塞事件循环。
我是否正确,可以通过在每次循环迭代中调用 sleep(0) 来完成与 Gevent 相同的操作?
在解析数据库查询或 Python 代码(不是 IO 操作)的阻塞时间可以忽略不计时,这对于 Web 服务器是否真的有必要?
【问题讨论】:
我来自 Node.js,其中 https://github.com/caolan/async 等库允许异步迭代数组而不阻塞事件循环。
我是否正确,可以通过在每次循环迭代中调用 sleep(0) 来完成与 Gevent 相同的操作?
在解析数据库查询或 Python 代码(不是 IO 操作)的阻塞时间可以忽略不计时,这对于 Web 服务器是否真的有必要?
【问题讨论】:
Gevent 有一个 gevent.idle() 电话只是为了这个目的(这似乎是无证的:http://www.gevent.org/gevent.html#useful-general-functions)。
但是,如果您确定循环会执行一些耗时的 CPU 繁重处理,最好使用 multiprocessing 或线程将其卸载到真正的并行工作程序,但请记住,您必须采取额外措施使两者都能很好地与 Gevent 一起工作(afaik)。
【讨论】:
一般不会,
但是,如果处理整个数组所需的 CPU 时间如此之大以至于它所产生的延迟是不可接受的,那么您应该将整个事情卸载到另一个进程/任务队列系统。
每次您执行 sleep(0) 时,都会增加更多开销(切换进出),因此会变得更糟。
CPU 密集型和 IO 密集型任务不能很好地混合在同一个进程中。
或者,如果您不需要很多并发连接,请将 gevent 替换为 pre-fork 服务器。
【讨论】: