python twisted INotify 不阻塞 react 器

标签 python twisted blocking inotify

我正在使用 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/

相关文章:

python - 递归函数 - 计算元组中偶数的个数

Windows:如何显示非阻塞警报/确认窗口?

python - Twisted - 将 Deferred 用于另一个 sql 查询

python - 我可以从 Twisted LoopingCall 返回的最高保真度约为 100 毫秒(0.1 秒)

python - Twisted Python 中的 TLS - 如何创建 server.pem?

c# - Process.Start 在某些客户端上随机阻塞/挂起

Linux - 断开连接发送超时

python - 如何在同一绘图上正确绘制个别年份的月度数据

python - pandas - 根据另一列中的每个唯一值计算 DataFrame 中某个值的出现次数

python - python对象的自动redis查找