【问题标题】:Gevent: is it a good practice to yield in each for-loop iteration?Gevent:在每次 for 循环迭代中让出是一种好习惯吗?
【发布时间】:2014-04-02 22:19:47
【问题描述】:

我来自 Node.js,其中 https://github.com/caolan/async 等库允许异步迭代数组而不阻塞事件循环。

我是否正确,可以通过在每次循环迭代中调用 sleep(0) 来完成与 Gevent 相同的操作?

在解析数据库查询或 Python 代码(不是 IO 操作)的阻塞时间可以忽略不计时,这对于 Web 服务器是否真的有必要?

【问题讨论】:

    标签: python gevent greenlets


    【解决方案1】:

    Gevent 有一个 gevent.idle() 电话只是为了这个目的(这似乎是无证的:http://www.gevent.org/gevent.html#useful-general-functions)。

    但是,如果您确定循环会执行一些耗时的 CPU 繁重处理,最好使用 multiprocessing 或线程将其卸载到真正的并行工作程序,但请记住,您必须采取额外措施使两者都能很好地与 Gevent 一起工作(afaik)。

    【讨论】:

      【解决方案2】:

      一般不会,

      但是,如果处理整个数组所需的 CPU 时间如此之大以至于它所产生的延迟是不可接受的,那么您应该将整个事情卸载到另一个进程/任务队列系统。

      每次您执行 sleep(0) 时,都会增加更多开销(切换进出),因此会变得更糟。

      CPU 密集型和 IO 密集型任务不能很好地混合在同一个进程中。

      或者,如果您不需要很多并发连接,请将 gevent 替换为 pre-fork 服务器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-13
        • 2012-05-30
        • 2014-11-05
        • 1970-01-01
        • 2018-11-17
        • 2021-02-13
        相关资源
        最近更新 更多