gpt4 book ai didi

python twisted INotify 不阻塞 react 器

转载 作者:太空宇宙 更新时间:2023-11-04 07:24:41 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com