我正在使用 twsited 的 INotify 来监视/dev 目录以监视正在添加的新串行设备。我目前使用的代码与下面类似。
notifier = INotify()
notifier.watch(FilePath("/dev"), IN_CREATE, callbacks=[self.created])
notifier.startReading()
def created(self, ignored, path, mask):
...
blocking code
...
我目前遇到的问题是,当调用“created”时,它阻塞了我的 react 器,因此其他网络 session (我的 TCP 和 UDP 连接都与同一个 react 器关联)必须等待“created” ' 方法完成。
有谁知道如何让“created”方法在后台运行,这样它就不会阻塞我的 react 堆?
谢谢,
西蒙
最佳答案
Twisted 中的所有事件处理程序都在“ react 器线程”中运行 - UDP、TCP,实际上还有 inotify。他们都应该通过不阻塞来与系统合作。所以,从这个意义上说,这只是一个关于如何在 Twisted 中编写好的事件处理程序的问题,而不是特别关于 inotify 的问题。
有很多选项可以避免阻塞。回答您的问题的棘手之处在于,正确的选项取决于当前代码块的确切原因。
它做套接字 I/O 吗?使用 Twisted's non-blocking socket I/O而是 API。
它做文件系统 I/O 吗?您可能需要 use a thread在这里,因为没有非阻塞文件系统 I/O 是很困难的(也许并非不可能)。
它与 SQL 数据库对话吗?也许twisted.enterprise.adbapi可以提供帮助。
等等。
我不知道这是否涵盖您所处的情况。但是,我要强调两点。首先,在 Twisted 程序中使用线程是完全合理的。 Twisted 的大部分内容都存在,因此您必须 使用线程,但是如果您遇到线程完成工作而其他任何东西都无法完成的情况 - 那就去吧(小心 ;)。 Twisted 甚至有一些帮助程序可以使它变得更容易,例如 zeekay 提到的 deferToThread
。其次,为任务选择合适的解决方案。所有“阻塞”问题的集合仅略小于所有一般编程问题的集合。有很多可能的解决方案。有些,例如线程,似乎具有广泛的适用性,但稍加注意,您可能会发现更适合特定情况的东西。
另外,看看Twisted: Making code non-blocking以获得进一步的解释。
关于python twisted INotify 不阻塞 react 器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6200240/