Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.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 如何在异步IO中使用kqueue进行文件监视?_Python_Macos_Python Asyncio_Kqueue - Fatal编程技术网

Python 如何在异步IO中使用kqueue进行文件监视?

Python 如何在异步IO中使用kqueue进行文件监视?,python,macos,python-asyncio,kqueue,Python,Macos,Python Asyncio,Kqueue,我想使用监视文件的更改。我可以看到如何以线程方式使用select.kqueue 我正在寻找一种将其用于asyncio的方法。我可能错过了一些非常明显的东西。我知道python使用。我很高兴任何解决方案只在使用kqueue选择器时才起作用 到目前为止,我能看到的唯一方法是创建一个线程,从另一个线程继续执行queue.control,然后使用asyncio.loop.call\u soon\u threadsafe将事件注入。我觉得应该有更好的方法。您可以使用将来自kqueue objet的FD作为

我想使用监视文件的更改。我可以看到如何以线程方式使用select.kqueue

我正在寻找一种将其用于asyncio的方法。我可能错过了一些非常明显的东西。我知道python使用。我很高兴任何解决方案只在使用kqueue选择器时才起作用


到目前为止,我能看到的唯一方法是创建一个线程,从另一个线程继续执行queue.control,然后使用asyncio.loop.call\u soon\u threadsafe将事件注入。我觉得应该有更好的方法。

您可以使用将来自kqueue objet的FD作为读卡器添加到控制循环中。然后,控制循环将通知您事件已准备好收集

这样做有两个特点,对于熟悉kqueue的人来说可能很奇怪:

是一种一次性方法,它首先更改监视器并等待新事件的到来。因为我们不希望它阻塞,所以必须将这两个操作拆分为一个非阻塞调用来修改监视器,然后再拆分为第二个非阻塞调用来收集结果事件。 因为我们不想阻塞,所以不能使用超时。这可以通过asyncio.wait_for重新实现 有更有效的方法编写此文件,但下面是一个示例,说明如何使用异步方法(名为kqueue\U control)完全替换select.kqueue.control:

异步def kqueue_controlkqueue:select.kqueue, 更改:可选[Iterable[select.kevent]], 最大事件数:int, 超时:可选[int]: def接收结果: 尝试: 事件已准备好收集;取回它们,但不要阻止它们 结果=kqueue.controlNone,最大事件数,0 例外情况除外,例如: future.set_exceptionex 其他: future.set\u resultresults 最后: loop.remove\u readerkqueue.fileno 如果这个调用是非阻塞的,那么就执行它 如果超时=0或最大事件=0: 返回kqueue.controlchanges,最大事件数,0 应用更改,但不要等待事件 kqueue.controlchanges,0 loop=asyncio.get\u running\u loop future=loop.create\u future loop.add\u readerkqueue.fileno,接收\u结果 如果超时为无: 回归等待未来 其他: return wait asyncio.wait\u forfuture,超时
您可以使用将来自kqueue objet的FD作为读卡器添加到控制循环。然后,控制循环将通知您事件已准备好收集

这样做有两个特点,对于熟悉kqueue的人来说可能很奇怪:

是一种一次性方法,它首先更改监视器并等待新事件的到来。因为我们不希望它阻塞,所以必须将这两个操作拆分为一个非阻塞调用来修改监视器,然后再拆分为第二个非阻塞调用来收集结果事件。 因为我们不想阻塞,所以不能使用超时。这可以通过asyncio.wait_for重新实现 有更有效的方法编写此文件,但下面是一个示例,说明如何使用异步方法(名为kqueue\U control)完全替换select.kqueue.control:

异步def kqueue_controlkqueue:select.kqueue, 更改:可选[Iterable[select.kevent]], 最大事件数:int, 超时:可选[int]: def接收结果: 尝试: 事件已准备好收集;取回它们,但不要阻止它们 结果=kqueue.controlNone,最大事件数,0 例外情况除外,例如: future.set_exceptionex 其他: future.set\u resultresults 最后: loop.remove\u readerkqueue.fileno 如果这个调用是非阻塞的,那么就执行它 如果超时=0或最大事件=0: 返回kqueue.controlchanges,最大事件数,0 应用更改,但不要等待事件 kqueue.controlchanges,0 loop=asyncio.get\u running\u loop future=loop.create\u future loop.add\u readerkqueue.fileno,接收\u结果 如果超时为无: 回归等待未来 其他: return wait asyncio.wait\u forfuture,超时