【问题标题】:libuv combines mutliple async calls and invokes callback oncelibuv 结合多个异步调用并调用一次回调
【发布时间】:2014-12-10 11:40:28
【问题描述】:

要求:一个 UDP 服务器,它在接收到 UDP 数据包并将接收到的数据包存储到两个队列之一。每个队列关联一个工作线程,关联线程从队列的最前面提取数据包,处理后写入内存缓存系统。

约束:解决方案必须基于事件循环(libuv)并用C编写

我的解决方案

  • 为传入的 UDP 注册一个回调,它将接收到的数据包添加到两个队列之一并引发 uv_async_send

  • 为每个队列创建两个全局 uv_sync_t 对象,并用作 uv_async_send 的参数。例如:如果数据包被添加到 queue-one,那么 uv_sync_t object-1 被用作 uv_async_send 的参数。类似地,如果数据包被添加到 queue-2,那么使用 uv_sync_t object-2

  • 两个线程被启动,每个线程都有自己的循环和一个与回调绑定的句柄

    • 在线程一中,uv_sync_t 对象 1 被绑定到一个函数(比如 funcA)。 在线程二中,uv_sync_t object-2 被绑定到另一个函数(比如 funcB)
    • funcA 和 funcB 从相应队列中读取“SINGLE”数据包并存储在内存缓存中

问题 客户端发送大量数据包,这些数据包在服务器中注册了大量事件。现在的问题是 libuv 将多个调用合并为一个并调用单个回调(从队列中删除一个 SINGLE 节点)。这会导致节点以更快的速度添加到队列中并以非常慢的速度移除。这些费率可以平衡吗?

有没有更好的方法来使用事件循环库 libuv 来设计服务器?

【问题讨论】:

    标签: c multithreading event-loop libuv


    【解决方案1】:

    由于您在一个线程中对数据包进行排队,但在另一个线程中进行处理,因此它们的工作速率可能略有不同。我会使用线程安全队列(查看 concurrencykit.org)并在异步回调中处理整个队列,而不是只处理单个数据包。

    【讨论】:

      猜你喜欢
      • 2015-12-31
      • 2019-05-15
      • 2013-04-27
      • 1970-01-01
      • 2011-01-22
      • 2021-09-07
      • 2014-08-23
      • 2021-12-03
      • 1970-01-01
      相关资源
      最近更新 更多