You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中通过事件处理异步文件加载

解决Python中异步文件加载的事件等待问题

因为你仅需要在文件加载这一步等待事件触发,不需要全事件驱动架构,Python标准库的threading.Event是最适合的方案——它是专门用于同步线程、等待某个事件发生的轻量级原语,完全符合你的需求。

单文件加载的实现步骤

  1. 创建同步事件与结果存储:用threading.Event标记加载完成状态,同时准备变量存储事件返回的FileLoaded对象。
  2. 定义回调函数:这个函数会被OnFileLoaded事件触发,负责保存加载结果并标记事件完成。
  3. 绑定回调到API事件:将回调函数注册到FileLoader的OnFileLoaded事件上。
  4. 触发异步加载并等待:调用LoadFile后,用Event.wait()高效等待加载完成。
  5. 处理结果与清理:加载完成后处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:55:38