如果决定使用线程而不是进程来处理文件,可以利用threading模块来实现。与使用进程相比,线程共享内存空间,因此对于文件访问的控制需要更加小心以避免冲突。以下是一个基于线程的解决方案:
python
import threading
import time
from queue import Queue
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
# 文件处理函数
def process_file(path, lock):
with lock:
# 假设的文件处理逻辑
result = f"Processed content of {path}"
with open(f"{path}.processed", "w") as f:
f.write(result)
# 文件系统事件处理器
class MyHandler(FileSystemEventHandler):
def __init__(self, task_queue, lock):
self.task_queue = task_queue
self.lock = lock
def on_created(self, event):
if event.is_directory:
return
self.task_queue.put(event.src_path)
def worker(task_queue, lock):
"""工作线程函数"""
while True:
path = task_queue.get()
if path is None: # 如果收到结束信号,则退出循环
task_queue.task_done()
break
process_file(path, lock)
task_queue.task_done()
def main():
task_queue = Queue()
lock = threading.Lock()
observer = Observer()
observer.schedule(MyHandler(task_queue, lock), path='./watchdir', recursive=False)
observer.start()
try:
# 初始化一些工作线程,这里没有指定确切数量,可以根据需要动态调整
for _ in range(5): # 示例中初始化5个工作线程,可根据资源情况调整
t = threading.Thread(target=worker, args=(task_queue, lock))
t.daemon = True # 设置为守护线程,主程序结束时自动结束
t.start()
while True:
time.sleep(1) # 防止CPU过度占用
except KeyboardInterrupt:
observer.stop()
print("Stopping...")
# 清理和结束
for _ in range(threading.active_count() - 1): # 减1是因为不包括主线程
task_queue.put(None) # 发送结束信号
observer.join()
if __name__ == "__main__":
main()
们使用了线程而非进程,并且利用threading.Lock来确保对文件的独占访问,从而避免写文件冲突。虽然没有直接动态创建线程来响应每个文件创建事件,但你可以根据实际需求调整初始化的工作线程数量,或者设计更复杂的逻辑来动态调整线程池大小。请注意,由于线程共享内存,过度增加线程数量可能会导致竞态条件或其他并发问题,因此需要谨慎管理线程数量。