[英]Python multiple threads accessing same file
我有两个线程,一个写入文件,另一个周期性地将文件移动到另一个位置。 写入总是在写入消息之前open
,并在写入消息后调用close
。 搬家公司使用shutil.move来搬家。
我看到第一次移动完成后,编写器无法再写入文件,即第一次移动后文件的大小始终为0。 难道我做错了什么?
锁定是一种可能的解决方案,但我更喜欢通过单个独立线程处理每个外部资源(包括文件)的一般体系结构。 其他线程将工作请求发送到Queue.Queue实例上的专用线程(如果它们需要返回结果,则提供它们自己的单独队列作为工作请求参数的一部分),专用线程将大部分时间花在等待a .get
该队列以及何时获取请求并继续执行(并在需要时返回传入队列中的结果)。
我已经提供了这种方法的详细示例,例如“Python in a Nutshell”。 Python的Queue本质上是线程安全的,可以极大地简化您的生活。
这种架构的优点之一是,当您决定将某些工作转换为单独的流程而不是单独的线程(例如,利用多个核心)时,它可以平滑地转换为多处理 - multiprocessing
提供了自己的类似工作的Queue
类型像丝绸一样顺利过渡;-)。
当两个线程访问相同的资源时,会发生奇怪的事情。 为避免这种情况,请始终锁定资源。 Python具有方便的threading.Lock
,以及其他一些工具(请参阅threading
模块的文档)。
查看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.")
我见过的更优雅的图书馆之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.