- 顺序(for loop)
- 最简单,易于调试。适用于文件少或需要严格顺序处理场景。
- multiprocessing / ProcessPoolExecutor(多进程)
- 适合 CPU 密集型任务(可以利用多核)。
- 代价:进程启动/通信开销、需要序列化(pickling)函数参数/结果,某些对象不可序列化(如打开的 socket)。
- 在 notebook 中直接使用可能需要 if name == “main” 保护,或把逻辑放到脚本中运行。
- asyncio + aiohttp / 异步 I/O
- 适合大量并发、轻量级的 I/O(例如同时对许多服务器发请求)。
- 优点:在高并发 HTTP 请求场景下能更省内存,比线程更高效。
- 缺点:需要将代码改为 async/await 风格,第三方库需要异步版本(requests → aiohttp)。
- 分布式 / 任务队列(Celery, RQ, Kafka 等)
- 当任务量非常大或需要持久化/重试/可观察性时,使用队列把任务分发到 worker 集群。
- 生产级方案,代价是更多基础设施。
- 子进程 / 外部程序
- 把 PDF 解析或 OCR 放到单独进程或容器里,Python 只是调度。
- 线程池 + 限速 + 重试(常见组合)
- 对外部 API 做批量请求时通常需要限速(避免被封)、重试与超时控制。