- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我的应用程序中,我需要监视新文件的目录。流量非常大,每秒至少会出现数百个新文件。目前我正在使用这种想法的繁忙循环:
while True:
time.sleep(0.2)
if len(os.listdir('.')) > 0:
# do stuff
运行分析后,我发现很多时间都花在了 sleep 上,我想知道是否应该将其更改为使用轮询。
我正在尝试使用 select
中的可用类之一来轮询我的目录,但我不确定它是否真的有效,或者我只是做错了。
我的目录有一个 fd:
fd = os.open('.', os.O_DIRECT)
然后我尝试了几种方法来查看目录何时更改。例如,我尝试过的其中一件事是:
poll = select.poll()
poll.register(fd, select.POLLIN)
poll.poll() # returns (fd, 1) meaning 'ready to read'
os.read(fd, 4096) # prints largely gibberish but i can see that i'm pulling the files/folders contained in the directory at least
poll.poll() # returns (fd, 1) again
os.read(fd, 4096) # empty string - no more data
为什么 poll() 表现得好像有更多信息需要阅读?我假设它只会在目录中发生更改时才会这样做。
我在这里尝试做的事情是否可行?
如果不是,是否有其他更好的选择来替代 while True: look for changes
?
最佳答案
FreeBSD 和 Mac OS X 提供了一个名为 kqueue 的 inotify 模拟。在 FreeBSD 机器上输入 man 2 kqueue 以获得更多信息。对于 Freebsd 上的 kqueue,您可以在 http://people.freebsd.org/~dwhite/PyKQueue/ 获得 PyKQueue。 , 不幸的是没有积极维护所以你的里程可能会有所不同。
关于python - 使用 select/poll/kqueue/kevent 监视目录中的新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1165571/
我想用信号通知工作线程 - 它应该停止等待事件并检查一些全局条件。我在 Linux 上使用 epoll_pwait,我想在 Mac OS 上执行相同的操作。 但是kqueue(2)手册说: EVFIL
更改列表中的无效项(或设置了 EV_RECEIPT 的项)将导致 kevent 返回设置了 EV_ERROR 标志的结果。还有什么其他条件会导致该标志? Google 搜索显示 EV_RECEIPT
假设我们有一个像这样的简单程序: int fd; kq = kqueue(); EV_SET(&kev, fd, EVFILT_VNODE, EV_ADD, 0, 0, NULL); kevent(k
我需要设计一个“等待事件对象”的东西,它可以接受不透明的事件对象并能够阻塞,直到其中一个事件被发出信号。它应该适用于 MacOS/Linux/Windows。所以对于 Linux/Windows 来说
我有一个 kevent ev 和一个 int sock = socket(...)。当我执行 ev.ident == sock 时,g++47 警告我 warning: comparison betw
我尝试在文件上使用 kqeue 和 kevent,当我的文件被修改时,我将更新我的软件。当我的文件被删除时,我删除了我软件中的链接。 所以我初始化kqueue void myfct(char * pa
来自Kqueue Wikipedia Page : Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道。因此,可以修改事件过滤器以及接收未决事件,同时每次主事件循环迭代仅使用对 keven
我正在分析一个程序,其中绝大多数 (86%) 的时间花在两个运行时函数上:kevent 和 selectgo。我理解select,但是我不知道kevent是什么(所以我不知道从哪里开始优化): Sho
我有一堆文件描述符的列表,我已经为这些文件描述符创建了 kevent,我正在尝试弄清楚是否有任何方法可以获取准备好进行读取或写入访问的文件描述符的数量。 有什么方法可以获取“就绪”文件描述符的列表,就
这在 Swift 3.1 中有效,但是一旦我切换到 Xcode 9,它就会停止编译。这是示例代码: let kq: Int32 = 0 let changelist: UnsafePointer! =
在我的应用程序中,我需要监视新文件的目录。流量非常大,每秒至少会出现数百个新文件。目前我正在使用这种想法的繁忙循环: while True: time.sleep(0.2) if len(os
我有一个监听单个 UDP 套接字的线程,但也需要偶尔唤醒以执行其他任务。这些任务由时间的流逝或其他线程上的事件触发。我目前的设计是使用 select() 超时值作为调度定时器,当我需要从另一个线程唤醒
我正在将curl集成到基于kqueue的异步I/O事件循环中。 libcurl 具有出色的 API,可用于集成到应用程序事件循环中。 您为 libcurl 提供两个回调,一个用于设置计时器(用于限制请
今天我将一些代码从 select() 移植到 kqueue(),我注意到 kevent() 似乎没有 select() 的“异常设置”功能的模拟。 也就是说,select()的函数签名是: int s
我是一名优秀的程序员,十分优秀!