【问题标题】:how to break a long callback chain in libuv如何打破libuv中的长回调链
【发布时间】:2016-12-07 02:45:13
【问题描述】:

假设我们从 TCP 套接字接收数据,并逐步处理得到结果。每个步骤都实现为一个函数,该函数从前一个任务参数并将结果返回给下一个。我们将所有这些函数链接为一个回调链,并将每个函数命名为 f1 f2 ... fn

这个回调链中没有块函数,每个回调运行得非常快。但是整条链的运行时间是不可忽略的,所以单循环迭代运行整条链是不被接受的。

为了简单地将这些函数链接在一个回调链中,它将运行为:

data -> f1 -> f2 -> f3 -> f4 -> f5 ->... -> fn -> result
        |------- single loop iteration -------|

最好将这个链分成许多部分,并在一个循环迭代中运行每个部分。这看起来像:

data -> f1 ->  f2 -> f3 -> f4 -> f5 ->... -> fn-1  -> fn -> result
        | loop1 |    |-- loop 2 --|          |- loop m -|

我知道在 Twisted 中,存在一个 deferred() 来完成这样的任务。但是,在libuv中,该怎么做呢?

【问题讨论】:

  • 相信你可以使用uv_async

标签: c asynchronous libuv


【解决方案1】:

libuv 没有内置的 API 来执行此操作。不过,您确实有一些构建块:您可以创建某种“链”结构来记住状态,并在uv_idle_t 中运行它。请注意,空闲句柄会在它们处于活动状态时防止循环阻塞 i/o。

【讨论】:

    猜你喜欢
    • 2017-12-07
    • 2022-01-25
    • 1970-01-01
    • 2022-01-10
    • 2023-03-11
    • 2011-11-09
    • 2021-07-27
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多