如果在单线程环境下实现这一功能,可以使用watchdog来监控文件变化,并维护一个简单的任务队列来顺序处理文件。以下是一个单线程处理的示例:
python
import time
from queue import Queue
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
# 文件处理函数
def process_file(filename, queue):
print(f"Processing file: {filename}")
# 这里是处理文件的逻辑,比如读取文件内容、转换、写入新文件等
# 为了演示,这里模拟处理耗时
time.sleep(2)
print(f"Finished processing {filename}")
# 文件系统事件处理器
class MyHandler(FileSystemEventHandler):
def __init__(self, queue):
self.queue = queue
def on_created(self, event):
if not event.is_directory:
print(f"New file detected: {event.src_path}")
self.queue.put(event.src_path)
def main():
queue = Queue()
processed_files = set() # 用于记录已处理过的文件,防止重复处理
# 文件系统观察器
observer = Observer()
observer.schedule(MyHandler(queue), path='./watchdir', recursive=False)
observer.start()
try:
while True:
if not queue.empty():
filename = queue.get()
if filename not in processed_files:
process_file(filename, queue)
processed_files.add(filename)
else:
time.sleep(1) # 当队列为空时,暂停一下,避免CPU过度占用
except KeyboardInterrupt:
print("Stopping...")
finally:
observer.stop()
observer.join()
if __name__ == "__main__":
main()
在这个单线程版本中,我们移除了多线程或进程的复杂性,直接在主循环中检查队列是否为空,如果有待处理的文件,则调用process_file进行处理。为了避免重复处理同一个文件,我们引入了一个set来记录已处理过的文件路径。当用户按下Ctrl+C时,程序会优雅地停止观察并退出。