Python多线程访问同一文件

时间:2010-02-20 07:38:57

标签: python file multithreading

我有两个线程,一个写入文件,另一个定期写入 将文件移动到其他位置。写入总是在写入消息之前调用open,并在写入消息后调用close。推动者使用shutil.move进行移动。

我看到第一次移动完成后,编写器不能再写入文件,即第一次移动后文件的大小始终为0。我做错了吗?

3 个答案:

答案 0 :(得分:26)

锁定是一种可能的解决方案,但我更喜欢通过单个独立线程处理每个外部资源(包括文件)的一般体系结构。其他线程将工作请求发送到Queue.Queue实例上的专用线程(如果需要返回结果,则提供他们自己的单独队列作为工作请求参数的一部分),专用线程花费大部分时间等待该队列上的.get以及何时获得请求并继续执行(并在需要时返回传入队列中的结果)。

我已经提供了这种方法的详细示例,例如在“果壳中的Python”中。 Python的Queue本质上是线程安全的,可以极大地简化您的生活。

这种架构的优点之一是,如果您决定将某些工作转换为单独的流程而不是单独的流程(例如,利用多个核心),它会平滑地转换为multiprocessing - { {1}}提供了自己的工作multiprocessing类型,使这种过渡变得像丝绸般顺畅; - 。)。

答案 1 :(得分:7)

当两个线程访问相同的资源时,会发生奇怪的事情。为避免这种情况,请始终锁定资源。 Python具有方便的threading.Lock以及其他一些工具(参见threading模块的文档)。

答案 2 :(得分:4)

查看http://www.evanfosmark.com/2009/01/cross-platform-file-locking-support-in-python/

你可以使用他的代码的简单锁定,如Evan Fosmark在旧的StackOverflow问题中所写:

from filelock import FileLock

with FileLock("myfile.txt"):
    # work with the file as it is now locked
    print("Lock acquired.")

我见过的更优雅的图书馆之一。