Python 不堵塞反应器的反硝化
我正在使用twsited的INotify监视/dev目录,以监视添加的新串行设备。我目前使用的代码类似于下面的代码Python 不堵塞反应器的反硝化,python,twisted,blocking,inotify,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 ... 我
notifier = INotify()
notifier.watch(FilePath("/dev"), IN_CREATE, callbacks=[self.created])
notifier.startReading()
def created(self, ignored, path, mask):
...
blocking code
...
我现在遇到的问题是,当调用“created”时,它会阻塞我的reactor,因此其他网络会话(我有与同一reactor关联的TCP和UDP连接)必须等待“created”方法完成
有人知道我如何让“created”方法在后台运行,这样它就不会阻塞我的反应器了吗
谢谢
Simon您可以使用
twisted.internet.threads.deferToThread
在线程中运行阻塞代码:
deferToThread(self.created, ignored, path mask)
您可以使用
twisted.internet.threads.deferToThread
在线程中运行阻塞代码:
deferToThread(self.created, ignored, path mask)
Twisted中的所有事件处理程序都在“反应器线程”中运行—UDP、TCP,甚至inotify。他们都希望通过不阻塞来与系统合作。因此,从这个意义上讲,这只是一个关于如何用Twisted编写好的事件处理程序的问题,而不是关于inotify的问题 有很多避免阻塞的选项。回答您的问题的棘手之处在于,正确的选项取决于当前代码块的确切原因 它是否执行套接字I/O?改用API 它做文件系统I/O吗?在这里您可能需要这样做,因为没有无阻塞文件系统I/O是很困难的(也许不是不可能的) 它是否与SQL数据库通信?也许你能帮上忙 等等 我不知道这是否包括你的案子。不过,我要强调两件事。首先,在Twisted程序中使用线程是完全合理的。Twisted的很多功能都存在,因此您不必使用线程,但是如果您遇到线程完成任务而其他功能都无法完成的情况,那么就使用它(小心;)。Twisted甚至还提供了一些帮助工具,使其更简单,例如zeekay提到的
deferToThread
。其次,为任务选择合适的解决方案。所有“阻塞”问题的集合仅略小于所有一般编程问题的集合。有很多可能的解决方案。有些,比如线程,似乎有着广泛的适用性,但只要稍加注意,您可能会发现更适合特定环境的东西
另外,请看一些进一步的解释。Twisted中的所有事件处理程序都在“反应器线程”中运行—UDP、TCP,甚至inotify。他们都希望通过不阻塞来与系统合作。因此,从这个意义上讲,这只是一个关于如何用Twisted编写好的事件处理程序的问题,而不是关于inotify的问题 有很多避免阻塞的选项。回答您的问题的棘手之处在于,正确的选项取决于当前代码块的确切原因 它是否执行套接字I/O?改用API 它做文件系统I/O吗?在这里您可能需要这样做,因为没有无阻塞文件系统I/O是很困难的(也许不是不可能的) 它是否与SQL数据库通信?也许你能帮上忙 等等 我不知道这是否包括你的案子。不过,我要强调两件事。首先,在Twisted程序中使用线程是完全合理的。Twisted的很多功能都存在,因此您不必使用线程,但是如果您遇到线程完成任务而其他功能都无法完成的情况,那么就使用它(小心;)。Twisted甚至还提供了一些帮助工具,使其更简单,例如zeekay提到的
deferToThread
。其次,为任务选择合适的解决方案。所有“阻塞”问题的集合仅略小于所有一般编程问题的集合。有很多可能的解决方案。有些,比如线程,似乎有着广泛的适用性,但只要稍加注意,您可能会发现更适合特定环境的东西
此外,请查看进一步的解释。谢谢您的帮助和详细的答案。我花了一些时间研究了您提到的不同选项,deferToThread选项对我来说似乎很好。不过,您确实提到了一件看起来很有趣的事情,那就是您建议“使用Twisted的非阻塞套接字I/O API”。你能告诉我这些记录在哪里吗?再次感谢您的帮助。这是像我这样的新的扭曲感应者所需要的详细答案。非常感谢!有关Twisted的非阻塞网络I/O API的介绍,请参阅并感谢您的帮助和详细答案。我花了一些时间研究了您提到的不同选项,deferToThread选项对我来说似乎很好。不过,您确实提到了一件看起来很有趣的事情,那就是您建议“使用Twisted的非阻塞套接字I/O API”。你能告诉我这些记录在哪里吗?再次感谢您的帮助。这是像我这样的新的扭曲感应者所需要的详细答案。非常感谢!有关Twisted的非阻塞网络I/O API的介绍,请参阅和