【问题标题】:python twisted INotify without blocking reactorpython扭曲INotify而不阻塞反应器
【发布时间】:2011-06-01 11:13:42
【问题描述】:

我正在使用 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”被调用时,它阻塞了我的反应器,所以其他网络会话(我有与同一个反应器关联的 TCP 和 UDP 连接)必须等待“created” ' 方法来完成。

有谁知道如何让“created”方法在后台运行,这样它就不会阻塞我的反应器?

谢谢,

西蒙

【问题讨论】:

    标签: python twisted blocking inotify


    【解决方案1】:

    Twisted 中的所有事件处理程序都在“反应器线程”中运行 - UDP、TCP 和 inotify。他们都希望通过不阻塞来与系统合作。所以,从这个意义上说,这只是一个关于如何在 Twisted 中编写好的事件处理程序的问题,而不是具体的 inotify。

    有很多选项可以避免阻塞。回答您的问题的棘手之处在于,正确的选择取决于当前代码块的确切原因。

    它是否进行套接字 I/O?请改用Twisted'snon-blockingsocket I/O API。

    它是否进行文件系统 I/O?您可能需要在这里use a thread,因为没有一个非阻塞文件系统 I/O 很难(也许并非不可能)。

    它是否与 SQL 数据库通信?或许twisted.enterprise.adbapi 能帮上忙。

    等等。

    我不知道这是否涵盖了您所在的情况。但是,我将强调两点。首先,在 Twisted 程序中使用线程是完全合理的。大部分 Twisted 都存在,因此您不会必须使用线程,但如果遇到线程完成工作而没有其他工作的情况 - 去吧(谨慎;)。 Twisted 甚至有一些帮手使它变得更容易,例如 zeekay 提到的deferToThread。其次,为任务选择合适的解决方案。所有“阻塞”问题的集合仅比所有一般编程问题的集合略小。有很多可能的解决方案。有些,如线程,似乎具有广泛的适用性,但稍加注意,您可能会发现更适合特定情况的东西。

    此外,请查看Twisted: Making code non-blocking 以获得更多解释。

    【讨论】:

    • 感谢您的帮助和详细的回答。我花了一些时间探索您提到的不同选项,而 deferToThread 选项似乎对我很有效。您确实提到了一些看起来很有趣的事情,那就是您建议“使用 Twisted 的非阻塞套接字 I/O API”。你能指出这些记录在哪里吗?再次感谢您的帮助。
    • 只是像我这样的新扭曲应征者需要的详细答案。非常感谢!
    【解决方案2】:

    您可以使用twisted.internet.threads.deferToThread 在线程中运行您的阻塞代码:

    deferToThread(self.created, ignored, path mask)
    

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 2013-01-16
      相关资源
      最近更新 更多