python twisted INotify不阻塞反应器

Sim*_*mon 1 python twisted inotify blocking

我正在使用twsited的INotify监视/ dev目录以监视正在添加的新串行设备.我目前使用的代码类似于下面的代码.

notifier = INotify()
notifier.watch(FilePath("/dev"), IN_CREATE, callbacks=[self.created])
notifier.startReading()

def created(self, ignored, path, mask):
    ...
    blocking code
    ...
Run Code Online (Sandbox Code Playgroud)

我现在遇到的问题是当'created'被调用时,它阻塞了我的反应器,所以其他网络会话(我有同一个反应器的TCP和UDP连接)必须等待'created'方法完.

有谁知道如何让"创建"方法在后台运行,所以它不会阻止我的反应堆?

谢谢,

西蒙

Jea*_*one 7

Twisted中的所有事件处理程序都在"reactor线程"中运行 - UDP,TCP,并且实际上是inotify.他们都希望通过不阻塞来与系统合作.所以,从这个意义上说,这只是一个关于如何在Twisted中编写好的事件处理程序的问题,而不是特别是关于inotify的问题.

有很多选项可以避免阻塞.回答你的问题的棘手问题是正确的选项取决于为什么当前的代码阻塞.

它是否进行套接字I/O?请改用Twisted的 非阻塞 套接字I/O API.

它是否进行文件系统I/O?您可能需要在此处使用一个线程,因为没有阻塞文件系统I/O很困难(也许并非不可能).

它是否与SQL数据库通信?也许twisted.enterprise.adbapi可以提供帮助.

等等.

我不知道这是否涵盖你所处的案例.但是,我会强调两件事.首先,在Twisted程序中使用线程是完全合理的.许多扭曲的存在,所以你不会使用线程,但如果你来到一个地方的情况线程完成工作,没有别的不-去为它(慎用).扭曲甚至有一些帮助使其更容易,如deferToThreadzeekay提到的.其次,为任务选择合适的解决方案.所有"阻塞"问题的集合仅略微小于所有一般编程问题的集合.有很多可能的解决方案.有些像线程似乎具有广泛的适用性,但是稍微小心一点,你可能会发现一些更特别适合特定环境的东西.

另外,请看一下Twisted:使代码无阻塞以获得进一步的解释.