锁定是一种可能的解决方案,但是我更喜欢由单个单独的线程处理每个外部资源(包括文件)的通用体系结构。其他线程将工作请求发送到Queue.Queue实例上的专用线程(并在需要返回结果时提供自己的单独队列作为工作请求参数的一部分),专用线程将大部分时间都花在等待.get
on该队列,并在收到请求时继续执行它(并在需要时在传入队列中返回结果)。
我在“坚果中的Python”中提供了这种方法的详细示例。Python的Queue本质上是线程安全的,极大地简化了您的生活。
这种架构的优点之一是,如果您决定将一些工作切换到一个单独的进程而不是一个单独的线程(例如,利用多个内核),则可以平稳地转换为多进程-multiprocessing
提供自己的类似工作Queue
类型来实现如丝绸般平滑的过渡;-)。