如何在Python中通过事件处理异步文件加载
解决Python中异步文件加载的事件等待问题
因为你仅需要在文件加载这一步等待事件触发,不需要全事件驱动架构,Python标准库的threading.Event是最适合的方案——它是专门用于同步线程、等待某个事件发生的轻量级原语,完全符合你的需求。
单文件加载的实现步骤
- 创建同步事件与结果存储:用
threading.Event标记加载完成状态,同时准备变量存储事件返回的FileLoaded对象。 - 定义回调函数:这个函数会被
OnFileLoaded事件触发,负责保存加载结果并标记事件完成。 - 绑定回调到API事件:将回调函数注册到
FileLoader的OnFileLoaded事件上。 - 触发异步加载并等待:调用
LoadFile后,用Event.wait()高效等待加载完成。 - 处理结果与清理:加载完成后处理
FileLoaded数据,记得解绑回调避免内存泄漏。
代码示例:
import threading # 初始化同步事件与结果存储 load_event = threading.Event() loaded_file_info = None def file_loaded_handler(file_loaded_obj): """OnFileLoaded事件的回调函数""" global loaded_file_info # 保存API返回的文件加载数据 loaded_file_info = file_loaded_obj # 标记加载完成事件 load_event.set() # 初始化API的FileLoader实例 file_loader = API.FileLoader() # 绑定回调到OnFileLoaded事件(注意用+=操作符,符合.NET事件绑定语法) file_loader.OnFileLoaded += file_loaded_handler # 触发异步文件加载 file_loader.LoadFile("你的文件路径") # 等待加载完成,设置超时时间防止无限阻塞(单位:秒) load_event.wait(timeout=30) if load_event.is_set(): # 文件加载成功,处理返回数据 print(f"加载完成,文件路径:{loaded_file_info.FilePath}") # 这里写你的后续业务逻辑 else: print("文件加载超时,请检查文件或API连接") # 解绑回调,避免内存泄漏(如果FileLoader实例会被复用的话) file_loader.OnFileLoaded -= file_loaded_handler
多文件批量加载的处理
如果需要同时加载多个文件并分别处理结果,可以封装一个工具函数,为每个文件单独创建同步事件:
import threading def load_file_sync(file_loader, file_path, timeout=30): """同步加载单个文件的封装函数""" load_event = threading.Event() result = None def callback(file_loaded): nonlocal result result = file_loaded load_event.set() # 绑定回调并触发加载 file_loader.OnFileLoaded += callback file_loader.LoadFile(file_path) # 等待完成 load_event.wait(timeout=timeout) # 解绑回调 file_loader.OnFileLoaded -= callback if load_event.is_set(): return result raise TimeoutError(f"加载文件 {file_path} 超时,超过 {timeout} 秒") # 使用示例 file_loader = API.FileLoader() try: file1_data = load_file_sync(file_loader, "file1.txt") file2_data = load_file_sync(file_loader, "file2.txt") # 分别处理两个文件的数据 print(f"文件1加载结果:{file1_data}") print(f"文件2加载结果:{file2_data}") except TimeoutError as e: print(e)
关键注意事项
- 回调参数匹配:回调函数的参数必须和
OnFileLoadedDelegate定义一致,即接收一个API2.Models.FileLoaded类型的参数。 - 超时设置:一定要给
wait()设置超时,防止程序因API异常而无限阻塞。 - 事件解绑:使用完后用
-=解绑回调,避免FileLoader实例长期持有回调函数导致内存泄漏。 - 关于BeginInvoke/EndInvoke:这些是.NET委托的异步调用方法,你不需要手动调用——API内部触发
OnFileLoaded事件时,会自动调用你绑定的回调函数。
内容的提问来源于stack exchange,提问作者user2731076
相关产品推荐
相关产品推荐

