问题标签 [libuv]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1257 浏览

libuv - 如何使用 libuv 进行直接文件描述符读取?

作为我正在从事的项目调查的一部分,我一直在研究用于检测和读取来自套接字的数据的不同事件循环机制/库。具体来说,我需要做的很简单:

  1. 检测来自客户端连接的数据
  2. 将文件描述符传递给工作线程进行读取和处理

Epoll 边缘触发非常适合这个目的,我喜欢边缘触发的行为,所以我只会在数据可用时收到一次通知。我尝试使用 libev 执行类似以下伪代码的操作,这似乎可行:

由于libuv旨在用于类似目的并且是边缘触发的,因此我正在尝试做类似的事情但尚未成功。使用libuv,我知道您可以use uv_read_start从流中读取数据,但是使用此方法,将uv_read_cb返回一个充满数据的缓冲区。由于我需要处理需要读取的数据量,并且为了避免将数据从这个缓冲区复制到不同的结构,我希望能够直接从套接字读取。

这种情况libuv可以使用吗?

提前致谢!

0 投票
2 回答
9687 浏览

c - 正确关闭 libUV 句柄

我试图找出如何解决我在使用 Valgrind 运行这个程序时遇到的这些内存泄漏。泄漏发生在nShell_client_main. 但我不确定如何正确释放它们。

我尝试在 nShell_Connect 上释放它们,但它导致 libUV 中止程序。我尝试在 结束时释放它们nShell_client_main,但是在关闭循环时出现读/写错误。有谁知道我应该如何关闭这些句柄?我读过这个,这让我开始了。但是,它看起来已经过时了,因为uv_ip4_addr在最新版本中有不同的原型。

nShell_main是“入口”点)

断言发生在这段代码摘录中 switch 语句的末尾(取自 Joyent 在 Github 上的 libUV 页面):

我可以uv__tcp_close手动调用,但它不在公共标题中(而且可能不是正确的解决方案)。

0 投票
1 回答
1832 浏览

qt - qt中的libuv事件循环

有没有不使用多线程的方法?

我发现了这个https://stackoverflow.com/a/17329626/4014896

但我不明白它是如何工作的。它不应该在示例中导致 100% 的 CPU 使用率吗?以及如何将它嵌入到 QT 中?

还有这个:https ://github.com/svalaskevicius/qt-event-dispatcher-libuv 但是根本没有文档。但从我看来,它似乎是从示例 QSocket 转换为 uv_tcp_socket 的东西,这不是我正在寻找的东西。

0 投票
1 回答
1449 浏览

c++11 - 您对 LibSourcey 的体验

刚在谷歌搜索 libuv 时遇到了libsourcey。它看起来很有特色,但我找不到任何可靠的评论或基准(事实上,这似乎是关于 LibSourcey 堆栈溢出的第一篇文章。)

有没有人对这个框架有任何经验?

0 投票
2 回答
1134 浏览

node.js - libuv 和 Node.js 是如何实际调度计时器的?

libuv 和操作系统如何在 Node.js 中实际调度 setTimeout 和 setInterval 等定时器?我看到在计时器触发之前,节点进程没有使用 CPU。这是否意味着操作系统会安排定时器,并在定时器触发时唤醒 Node 进程?如果是这样,操作系统如何安排计时器以及硬件如何执行它?

0 投票
3 回答
21146 浏览

c++ - C++ 错误:必须调用对非静态成员函数的引用

我正在尝试创建一个类来抽象 libuv 网络功能的一些基本行为。

前面显示的代码的问题是,当我尝试编译它时,我收到以下错误:

它指出listen_uv_listen_uv_connection_cb了罪魁祸首。

有人可以向我解释一下,为什么这是一个错误,我应该如何解决它?

uv_listen()签名uv_connection_cb声明如下

0 投票
3 回答
2376 浏览

node.js - 触摸文件,然后在节点中写入

在写入文件之前如何触摸文件?

试图

错误

这是一个 POSIX 错误(linux 手册页,另外为 Windows 实现,例如:在 libuv 中)。这意味着:没有这样的文件或目录

0 投票
1 回答
226 浏览

libuv - 如何一起使用 libuv 和 POLLPRI?

我针对定义为 Linux 字符设备的 API 编写应用程序,API 的大部分有趣部分都定义为 ioctl() 调用,当驱动程序通过 poll() 引发 POLLPRI 时,异步事件会传递给应用程序。我想尝试使用 libuv 改进它的应用程序方面。

我已经尝试过一种设备,驱动程序需要 read() 调用,因此它会引发 POLLIN。我使用了带有 UV_READABLE 的 uv_poll_t,这很好。然而,至少有两个设备在改变状态时专门使用 POLLPRI。

代码草图:

我从文档和实验中知道,如果驱动程序只提高 POLLPRI,正如规范所要求的那样,那么 uv_poll_t 将不起作用。

我正在考虑某种 prep/check/async 组合,但是为使用此 API 而构建的其他框架(定制的)使用“大调用轮询”模式,并且也旨在处理 POLLPRI。我认为,如果 POLLPRI 的民意调查与 libuv 正在进行的其他任何事情正确集成(而且我也对 libuv 的套接字有很多用途),它会更有效、更愉快。

所以如果我错过了什么,请告诉我。如果我对 POLLPRI 几乎没有直接支持是正确的,我希望了解 libuv 的人提供一些优雅的建议。

0 投票
1 回答
682 浏览

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

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

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

我的解决方案

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

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

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

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

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

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

0 投票
1 回答
190 浏览

libuv - count 合并为单个回调的 uv_async_send() 的数量

来自 libuv 的文档:http ://docs.libuv.org/en/v1.x/async.html?highlight=uv_async_t

警告 libuv 会合并对 uv_async_send() 的调用,也就是说,不是每次调用都会产生回调的执行,唯一的保证是它至少会被调用一次。因此,如果之前在短时间内调用过此函数,则调用此函数可能不会唤醒事件循环。

有没有办法找到组合调用单个回调的 uv_async_send() 的数量?