我有两个线程,一个写入文件,另一个定期写入
将文件移动到其他位置。写入总是在写入消息之前调用open
,并在写入消息后调用close
。推动者使用shutil.move进行移动。
我看到第一次移动完成后,编写器不能再写入文件,即第一次移动后文件的大小始终为0。我做错了吗?
答案 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.")
我见过的更优雅的图书馆之一。