John-Mark Gurney 18f53e26f9 | 4 years ago | |
---|---|---|
aiokq | 4 years ago | |
misc | 5 years ago | |
.gitignore | 5 years ago | |
LICENSE.txt | 5 years ago | |
Makefile | 5 years ago | |
README.md | 4 years ago | |
requirements.txt | 5 years ago | |
setup.py | 4 years ago |
This is a module to make select.kqueue module compatible with programs that use asyncio.
The core of kqueue is already implemented via the core asyncio, but other parts of kqueue, like EVFILT_VNODE and EVFILT_PROC are not. This module is currently limited to supporting basic EVFILT_VNODE functionality.
To watch a file for modification:
import aiokq
fp = open(fname)
async with aiokq.watch_file(fp) as wf:
while True:
data = fp.read()
# do some work on data
# wait for a modification
await wf()
The with symantics is required in order to address the race where a write is issued between the registration and the time that you do the read. There is the possibility that a wakeup happens and there are no modifications due to this race.
If you have a function that needed to process a file, you can use the run_on_modify function:
import aiokq
import asyncio
async def processfile(fp, state):
# process the file in fp
pass
fp = open(fname)
asyncio.create_task(aiokq.run_on_modify(fp, processfile, []))
The function processfile will be called once initially, to process the file, and then again after each modification. As writes or modifications may happen in blocks, it is entirely possible that processfile will be called in the middle of an update. It is up to the function to use file locking, or another mechanism (append only) to ensure that the file is in a stable state during processing, or simply return waiting for the next modification to complete.