繁体   English   中英

Python多线程访问同一文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM