我有两个线程,一个写入文件,另一个定期写入
将文件移动到不同的位置。写入总是在写入消息前调用open
,写入消息后调用close
。移动器使用 shutil.move 进行移动。
我看到在第一步完成后,编写器无法再写入文件,即在第一步之后文件的大小始终为 0。我做错了什么吗?
最佳答案
锁定是一种可能的解决方案,但我更喜欢让每个外部资源(包括文件)由一个单独的线程处理的通用架构。其他线程将工作请求发送到 Queue.Queue 上的专用线程实例(如果他们需要返回结果,则提供自己的单独队列作为工作请求参数的一部分),专用线程大部分时间都在等待该队列上的 .get
,无论何时获取一个请求并执行它(如果需要,在传入队列中返回结果)。
我已经提供了这种方法的详细示例,例如在“Python 简而言之”中。 Python 的队列本质上是线程安全的,可以极大地简化您的生活。
此架构的优点之一是它可以顺利转换为 multiprocessing。如果您决定将某些工作切换到单独的进程而不是单独的线程(例如,利用多核)——multiprocessing
提供了自己的工作方式类似的 Queue
类型使这种过渡如丝绸般顺畅;-)。
关于Python多线程访问同一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2301458/