Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 不堵塞反应器的反硝化_Python_Twisted_Blocking_Inotify - Fatal编程技术网

Python 不堵塞反应器的反硝化

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 ... 我

我正在使用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”时,它会阻塞我的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的介绍,请参阅和