我来自 Node.js,其中 https://github.com/caolan/async 等库允许异步迭代数组而不阻塞事件循环。
我是否正确,可以通过在每次循环迭代中调用
sleep(0)
来实现与 Gevent 相同的效果?
这对于 Web 服务器来说实际上是必要的吗?同时解析数据库查询或者 Python 代码(不是 IO 操作)的阻塞时间可以忽略不计?
Gevent 有
gevent.idle()
调用只是为了这个目的(这似乎没有记录:http://www.gevent.org/gevent.html#useful-general-functions)。
但是,如果您确定循环将执行一些耗时的 CPU 繁重处理,最好使用
multiprocessing
或线程将其卸载到真正的并行工作线程,但请记住,您必须采取额外的措施来使这些与 Gevent 合作愉快。
一般不会,
但是,如果处理整个数组所需的 CPU 时间太大,导致其产生的延迟不可接受,则应将整个数组卸载到另一个进程/任务队列系统。
每次执行 sleep(0) 都会增加更多开销(切换进出),因此这会让情况变得更糟。
CPU 密集型任务和 IO 密集型任务在同一进程中不能很好地混合。
或者,如果您不需要很多并发连接,请将 gevent 替换为 pre-fork 服务器。