c - libuv 结合了多个异步调用并调用一次回调

标签 c multithreading event-loop libuv

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

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

我的解决方案

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

  • 为每个队列创建一个全局 uv_sync_t 对象,并将其用作 uv_async_send 的参数。例如:如果数据包添加到队列一,则 uv_sync_t object-1 用作 uv_async_send 的参数。同样,如果数据包添加到队列二,则使用 uv_sync_t object-2

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

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

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

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

最佳答案

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

关于c - libuv 结合了多个异步调用并调用一次回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27400117/

相关文章:

即使积压队列已满,客户端也会连接到 TCP 迭代服务器

c++ - 编译 boost 时 `threading=multi` 到底做了什么?

python-3.x - 不使用 asyncio 编写 EventLoop

c - 帮助使用 libpng 将位图转换为内存中的 png

c - 从 char 数组中获取值

java - 预订应用程序中的同步

Java事件循环, sleep "gently"

javascript - Angular 1.x - $scope 的顺序发生了什么?

c - 在c中操作字符串

java - 在 Rx Observable 事务中使用 Realm 调用时,如何防止 Realm 线程问题?