问题标签 [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 回答
5649 浏览

c++ - 用于 mmorpg 服务器端的网络库 (libuv/boost::asio?)

我目前正在重写一个非常旧的 mmorpg 的服务器端,并且我正在寻找一个与 C/C++ 一起使用的好的开源网络库。

由于客户端已经存在,我不能使用任何强制某种数据包结构或通信的库(例如,RakNet)。

服务器将主要在三个不同的端口上使用 UDP。

在网上搜索后,我发现了 boost::asio 和 libuv。

boost::asio 似乎是一个成熟的选择,因为我已经在使用 boost,但是我读到他们的 UDP 实现有点差,并且由于使用时的一些锁,它无法实现多核处理器的最大性能民意调查。

libuv 看起来很棒,是事件驱动的,由一个大项目支持,但目前没有此类项目使用它,所以我对使用它表示怀疑。

你们怎么看?我可以在这样的项目中使用 libuv,还是必须使用 boost::asio?我也对其他建议持开放态度(它们需要跨平台,我已经放弃了 enet、libevent 和 libev)。

0 投票
1 回答
355 浏览

javascript - 在本机节点模块中,如何确保我的异步代码始终在同一个线程上运行?

我正在用 C++ 编写一个本地节点模块,它将成为 C 库的绑定。

此库中的某些对象只能由单个线程使用。这意味着如果我使用uv_queue_work我不能确保它们只被同一个线程使用,因为 -据我所知- libuv 使用一个线程池,我无法找出如何告诉它哪个线程用于此类工作。

以下是针对这种情况的一些想法,但我不确定哪种方法是正确的。

  • 只需使所有方法同步 - 不幸的是,这会超出节点的目的和概念,所以我不想这样做
  • 创建一个自定义线程并在其上执行我的代码 - 这会破坏 libuv 线程池的目的并需要更多工作
  • 以某种方式告诉 libuv 在其线程池中的同一线程上执行同一对象的操作 - 我在文档中没有找到执行此操作的方法

这种 Node.js 模块的推荐行动方案是什么?

0 投票
1 回答
497 浏览

node.js - 提供视频文件时 node.js 崩溃

我正在使用 node.js 和 video.js 插件提供静态视频文件(.ogv 和 .mov)。但是,node.js 不断崩溃并显示以下错误消息:

这是 node.js 代码:

我的 node.js 版本是“ v0.10.4

目录结构:

  • /myApp
    • /myApp/公共
      • /myApp/公共/视频

一个非常直接的静态文件服务。尝试将 express.static 放在 app.router 之后,以及 favicon 上方,没有这样的运气。

感谢任何建议。

0 投票
1 回答
5778 浏览

c - UV_RUN_NOWAIT 模式在 libuv 中是如何工作的?

当使用该函数在 libuv 中运行事件循环时uv_run,有一个“mode”参数与以下值一起使用:

前两个很明显。UV_RUN_DEFAULT运行事件循环,直到没有更多事件,并UV_RUN_ONCE处理循环中的单个事件。但是,UV_RUN_NOWAIT它似乎不是一个单独的模式,而是一个可以与其他两个值之一进行或运算的标志。

默认情况下,此函数会阻塞,直到事件处理完毕,并UV_RUN_NOWAIT使其成为非阻塞,但我能找到的任何文档都到此为止。我的问题是,如果你非阻塞地运行事件循环,回调是如何处理的?

libuv 事件模型是单线程的(反应器模式),所以我假设它需要阻塞才能调用回调,但是如果主线程被占用,事件处理后会发生什么?回调是否会被“排队”直到 libuv 再次控制主线程?还是会在另一个线程上分派回调?

0 投票
0 回答
760 浏览

javascript - pg db 查询上的节点断言失败

在 Windows 7 上的 nodejs (0.10.13) 上使用 any-db (0.0.6) 和 pg (2.1.0) 运行查询。使用 npm 的所有安装似乎都正常。可以设置连接池,但失败并出现低级错误:

抛出:断言失败:0,文件 c:\node-v0.10.13-x64\deps\uv\src\win\req-inl.h,第 219 行

(不能被 try/catch 捕获,此外该目录甚至不存在......)

尝试的节点版本:0.10.12 和 0.10.13

我在安装 pg 时遇到了一些问题,但似乎没问题,这是安装消息:

任何想法或帮助将不胜感激!


更新 1

重新启动计算机后,错误消息已更改为: Assertion failed: 0, file src\win\poll.c, line 87

这似乎是指这个:https ://github.com/joyent/libuv/blob/master/src/win/poll.c

我也间歇性地收到另一个错误。

尝试了 v0.10.10 .. 现在刚刚收到第一个错误。

更新 2

我尝试使用节点 v0.10.13-x86(而不是 x64)。重新安装 pg 后,我的代码似乎可以正常运行,但在重新安装 pg(使用 npm)期间会引发错误:

0 投票
3 回答
2197 浏览

c++ - 如何在 nodejs 插件中泵送窗口消息?

在 Windows nodejs 插件中,我创建了一个用于接收消息的窗口。

我有一个 wndproc 函数。

现在我需要发送消息。通常,你会做类似的事情

...但这不起作用,因为它只会阻止 v8 事件循环。

如何以不会阻止 v8 并允许我在窗口接收消息时调用 JS 函数的方式发送 Windows 消息?

我认为 libuv 将发挥作用,但我不确定如何安全地从在单独线程上运行的 C 调用 JS 函数,特别是因为uv_async_send不能保证每次调用它时都会调用回调,我需要确保每次收到窗口消息时都会调用我的 JS 回调。

0 投票
1 回答
375 浏览

c - 使用共享对象中定义的 C 函数而不重命名它们

我一直在阅读libuv 的在线书籍 Basics并尝试重写它们以使用静态链接和动态链接到 libuv 库。我重写了观察者示例(代码如下),但我必须“重命名”从 libuv.dylib 检索到的函数才能使其工作,这意味着我必须为动态链接案例编写一个完全独立的代码路径。我可以以某种方式保持相同的函数名称吗?

我希望我的代码看起来像这样。

目前,它看起来像这样。

0 投票
1 回答
681 浏览

node.js - 调试 node.js 进程的最佳实践?

我的 node.js 服务器收到很多 EMFILE,最终由于 libuv 无法创建 kqueue() 而中止。所以,我想看看发生这种情况时它会打开什么。我编写了附加的脚本,它分叉服务器,等待它崩溃,然后运行'lsof -p'。

我对文档的理解是,当一个分叉的孩子退出时,它会一直存在,直到 process.exit() 发生。这很好,因为 lsof 将能够在僵尸被擦除之前询问它的描述符:

然而,对 exec() lsof 的调用总是调用带有错误参数的回调(这是 lsof 包从不检查的):

但是,也许我看错了。该领域的最佳做法是什么?

0 投票
1 回答
1172 浏览

c++ - libuv: uv_check_t 和 uv_prepare_t 用法

我一直在阅读The libuv book,但是关于检查和准备观察者的部分不完整,所以我发现的唯一信息是在 uv.h 中:

我想知道libuv的检查和准备观察者是否有任何特殊用途。

我正在编写一个本地 node.js 绑定到一个需要处理从不同线程触发的事件的 c++ 库,所以自然地,应该从主线程调用回调。我尝试使用uv_async_t,但是 libuv 不保证每次都会调用一次回调,uv_async_send所以这对我不起作用。

这就是为什么我决定使用我自己的线程安全事件队列,我想定期检查它。所以我想知道为此目的是否可以使用检查或准备观察者。


实际上,我当前的解决方案确实使用了一个uv_async_t观察者 - 每次我收到一个事件时,我都会将它放入队列调用uv_async_send- 所以当最终调用回调时,我会处理当前队列中的所有事件。

我对这种方法的担忧是,许多事件实际上可能会排队,直到触发回调并且可能同时失效(通过失效,我的意思是此时处理它们变得毫无意义)。

所以我希望能够尽可能频繁地检查事件队列 - 检查/准备观察者可以提供哪些,但在每次事件循环迭代时这样做(并锁定互斥体)可能是一种过度杀伤力?

而且,更重要的是,也许它们应该服务于一些更特殊的目的,而不仅仅是保护每次循环迭代一次的回调调用?

谢谢

0 投票
2 回答
4054 浏览

c - libuv 未定义对 uv_loop_new 的引用

编译后,我尝试运行libuv示例程序:

但是,当尝试运行时,我收到以下错误:

我哪里做错了 ?

PS:它不适用于#include "uv.h"