Skip to main content
 首页 » 编程设计

python twisted INotify 不阻塞 react 器

2025年05月04日12hnrainll

我正在使用 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以获得进一步的解释。