Python 多线程访问同一文件
我有两个线程,一个是用来往文件里写东西的,另一个是定期把这个文件移动到别的地方。写文件的线程在写信息之前总是先调用 open
,写完后再调用 close
来关闭文件。而移动文件的线程则是用 shutil.move 来进行移动。
我发现第一次移动文件之后,写文件的线程就再也不能往这个文件里写东西了,也就是说,文件的大小在第一次移动后总是保持为0。我是不是做错了什么?
3 个回答
可以看看这个链接: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.")
这是我见过的比较优雅的库之一。
当两个线程同时访问同一个资源时,就会出现一些奇怪的问题。为了避免这种情况,记得要给资源上锁。Python 提供了一个很方便的工具 threading.Lock
来实现这个功能,还有其他一些工具(可以查看 threading
模块的文档了解更多)。
锁定是一种可能的解决方案,但我更喜欢一种架构,就是让每个外部资源(包括文件)由一个单独的线程来处理。其他线程会把工作请求发送给这个专门的线程,使用一个叫做Queue.Queue的工具(如果需要返回结果,还可以提供一个自己的队列作为请求参数)。这个专门的线程大部分时间都在等待从队列中获取请求,一旦收到请求,就会执行它(如果需要的话,还会把结果放到传入的队列中)。
我在《Python简明教程》中提供了这个方法的详细示例。Python的队列本身就是线程安全的,这让你的生活变得简单多了。
这种架构的一个优点是,如果你决定把一些工作转移到单独的进程而不是线程上(比如为了利用多个核心),它可以很顺利地转换到multiprocessing模块。这个模块提供了一个类似的队列类型,让这种转换变得非常顺畅;-)。