我有一个线程正在观看Mac OS X上的文件系统事件。如果我将100个文件复制到正在观看的文件夹中,我显然会收到多个文件系统事件,因此会有多个回调调用。我想知道这些回调电话是否一个接一个地处理?或者每个事件是否调用一个OS线程,后者又调用回调函数,在这种情况下,我们会有多个线程执行相同的回调函数?
答案 0 :(得分:1)
这取决于您使用哪种机制来监视文件系统事件。
对文件的每次访问都会在内核中生成通知。
如果您使用公开FSEvents API,过于频繁的更新会合并为一个通知。在这种情况下,接收端由run loop管理,即回调是在新的后台线程中调用而不是,或者是OS线程的上下文。它在您指定的事件循环中运行,通常是运行主事件处理循环的主线程。
如果您直接点击/dev/fsevents
(请参阅例如the OS X book),您将逐个获取调用线程中的所有事件,并且可能会通过一次调用返回多个事件。
同样,如果您改为使用BSD派生的kqueue
,如果事件频繁,您将从kqueue
的调用中获得多个事件。
在任何情况下,操作系统都不会在新的/ OS线程中运行您的回调,也不会神奇地复制观察文件系统活动的线程,以便他们可以同时处理事件。