在一个node.js进程中组合两个主循环

时间:2012-03-16 07:16:24

标签: javascript node.js

我想获取系统通知并通过http将其传递给客户端。

现在我使用node.js在一个进程中提供这两个服务,但是存在问题。 通知侦听器有自己的主循环侦听系统事件,并且当服务启动时,它使服务器停止提供http服务。我想如果我能将这两种服务的主循环合二为一,那么问题就可以解决了。这可能吗?我怎么才能开始?

谢谢,

以下是示例代码:

var server = require("express").createServer(),
    io = require('socket.io').listen(server);

server.listen(8000);
server.get("/", function (req, res) {
    res.sendfile("./public/main.html");
});
io.of('/images').on('connection', function (socket) {
    //read images and transfer
}
io.of('/notify').on('connection', function (socket) {
    //start listen system notifications
    notifyLib.start_daemon();
}

“notifyLib.start_daemon()”是一个原生扩展,其代码如下:

DBusError error;
int rt;

dbus_error_init (&error);
connection = dbus_bus_get (DBUS_BUS_SESSION, &error);
if (dbus_bus_name_has_owner(connection, DBUS_NAME, &error))
    printf("*** DBUS_NAME had owner\n");
rt = dbus_bus_request_name (connection, DBUS_NAME, 0, &error);
if (!dbus_connection_add_filter (connection, filter_func, NULL, NULL))
    printf("*** Failed to add filter\n");
if (!dbus_connection_register_object_path (connection, DBUS_PATH, &echo_vtable, (void*) 0xdeadbeef))
    printf("*** Failed to register object path\n");
while (dbus_connection_read_write_dispatch (connection, -1))
    ;
dbus_connection_remove_filter (connection, filter_func, NULL);
dbus_connection_unref (connection);
dbus_shutdown ();

要传输的图像很多,但是当监听器启动时,图像传输会停止。

2 个答案:

答案 0 :(得分:0)

希望我理解你的问题。

最简单的解决方案是使用Cluster

因为它分叉了几个进程来处理请求。

答案 1 :(得分:0)

从节点,您可以制作一个定时器来调用dbus_connection_read_write_dispatch()吗?

然后你可以删除while()循环。

您必须将dbus清理代码移动到节点可以在处理完DBus时调用的函数。

https://nodejs.org/en/docs/guides/timers-in-node/