我最近在读Redis.Redis实现了一个基于I/O多路复用的简单事件驱动库.Redis表示会选择系统支持的最佳多路复用,并提供以下代码:
/* Include the best multiplexing layer supported by this system.
* The following should be ordered by performances, descending. */
#ifdef HAVE_EVPORT
#include "ae_evport.c"
#else
#ifdef HAVE_EPOLL
#include "ae_epoll.c"
#else
#ifdef HAVE_KQUEUE
#include "ae_kqueue.c"
#else
#include "ae_select.c"
#endif
#endif
#endif
Run Code Online (Sandbox Code Playgroud)
我想知道他们是否有基本的性能差异?如果是这样,为什么?
最好的祝福
我是Cocoa Application开发的新手.我希望在修改给定目录下的任何文件时(文件夹观察者)通知我的应用程序.修改意味着删除,添加,文件内容被更改.我尝试使用FSEvents也使用NSWorkspace的通知中心或委托消息,如在UKKQueue中http://www.zathras.de/angelweb/sourcecode.htm#UKKQueue.我的应用程序在目录下的任何文件被修改时收到通知.但问题是它没有给出修改后的特定文件的名称或路径.它给出了目录的路径,但没有给出特定文件的路径.
不知道如何在特定文件中查看文件夹进行修改?
当你创建一个 kqueue 时,kqueue()你会得到一个文件描述符。但看来这个文件描述符不能用 进行有意义的轮询select()。我知道轮询/读取 a 的标准kqueue()方法是 withkevent(...)但我正在尝试与一些使用select().
这里的目标是能够触发可以通过select基于此的轮询机制检测到的“用户事件”(即使该事件最终需要kevent()稍后使用“消耗”)。EVFILT_USER这看起来像是天生要做的事情,但快速实验表明select(),当在 kqueue 中添加(并触发)事件时,不会将 kqueue 的 fd 报告为已准备好读取,它只是超时(或阻塞)永远)。(但是等效的kevent()调用确实会看到/返回该事件。)
难道我做错了什么?或者是不可能用 轮询 kqueue 的 fd select()?
Nginx使用epoll或其他多路复用技术(select)来处理多个客户端,即不像apache那样为每个请求生成一个新线程.
我尝试使用select在我自己的测试程序中复制相同的内容.我可以通过创建一个非阻塞套接字并使用select来决定服务哪个客户端来接受来自多个客户端的连接.我的程序只是将它们的数据回显给它们.它适用于小数据传输(每个客户端一些字节)
当我需要通过连接发送大文件到客户端时,会出现问题.由于我只有一个线程为所有客户端服务,直到我读完文件并将其写入套接字时,我无法恢复为其他客户端服务.
是否有针对此问题的已知解决方案,或者最好是为每个此类请求创建一个线程?
我很难理解如何将kqueue用于用户空间事件。
我寻找2个用例。
用例1:手动重置事件
用例2:自动重置事件
我想我了解如何使用kqueue()和kevent(),但是我不清楚传递给kevent()的事件如何查找相关操作:
让有一个名为“ event”的结构kevent变量。
让我们假设,我们没有问题找到一个新的事件ID,该事件ID与该kqueue实例的其他事件ID不冲突,名为“ eventId”。
看到了吗?在上面的EV_SET()调用中查看我需要帮助的地方。
对于用例1(手动重置事件),与用例2(自动重置事件)相比,操作(1)创建看上去可能有所不同。
操作(3)和(4)我完全处于黑暗中。这些可能需要EV_ENABLE / EV_DISABLE吗?EV_CLEAR安装在哪里?
到目前为止,我认为除了“调度”之外,我不需要执行任何操作(6)。我非常肯定,操作(5)可以像我上面给出的那样工作。
我现在花了一天的时间来尝试查找说明如何完成工作的文档或样本。我在苹果代码库中找到了一个kqueue测试程序,但我对此表示怀疑。同样,它在测试中仅发送1个事件,并且该事件终止接收线程的循环。因此,这无助于我了解2个用例的详细信息。
我打算现在在x86机器上的FreeBsd 9.1下使用它。
我发现这篇文章说 OpenJDK 在 Linux 上使用 epoll,但是有人知道 Selector 实现是否使用 kqueue、dev/poll 等而不是传统的轮询(如果可用)?
我使用kquque来监控桌面:
flags - EV_ADD | EV_CLEARfflags - NOTE_DELETE | NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB | NOTE_LINK | NOTE_RENAME | NOTE_REVOKEfilter - EVFILT_VNODE但是,当我.js使用sublime2软件在桌面上编辑文件时,它不会触发通知:(
请指教
这是我的js-ctypes代码:
var rez_fd = ostypes.API('kqueue')();
console.info('rez_fd:', rez_fd.toString(), uneval(rez_fd));
if (ctypes.errno != 0) {
throw new Error('Failed rez_fd, errno: ' + ctypes.errno);
}
this.kq = rez_fd;
this.path = OS.Constants.Path.desktopDir;
// Open a file descriptor for the file/directory that you want to monitor.
var event_fd = ostypes.API('open')(this.path, OS.Constants.libc.O_EVTONLY);
console.info('event_fd:', event_fd.toString(), uneval(event_fd));
if (ctypes.errno != …Run Code Online (Sandbox Code Playgroud)