Django - 如何确保文件I/O线程安全

1 投票
2 回答
1399 浏览
提问于 2025-04-16 03:25

我想以线程安全的方式从文件系统中读取和写入Python源文件。

open("n2.py","w").write(my_new_py_class)
from myproject import n2
#do something with n2

我认为这不是线程安全的,因为在请求2修改文件之前,请求1可能正在加载和执行这个文件。我想实现的效果是,一个线程在另一个线程写入、加载、执行并关闭文件之前要等着。

2 个回答

0

我遇到过类似的问题。可以看看Erik Karulf在这个问题中的回答:

Django和动态生成的图片

我们还提供了一些代码供参考哦 :)

4

你为什么要让你的应用程序修改自己的文件呢?这不仅非常不妥,而且元编程(就是程序自己生成代码的技术)理解起来也特别复杂,调试起来更是难上加难。而且,Python会缓存它导入的模块,所以重新加载这些模块并不简单。最后,如果你真的需要执行动态生成的代码,其实并不一定要把代码写到文件里。

关于如何安全地在多线程环境下写文件,一般的做法是:

  • 先把内容写到一个临时文件,这个临时文件要和目标文件在同一个文件系统上。
  • 然后把这个临时文件重命名为你的目标文件,这样就会覆盖掉旧的文件。

这样做是有效的,因为在POSIX系统上,重命名操作是原子的,也就是说在同一个设备上执行时,要么其他线程/进程看到的是旧文件,要么看到的是新文件,避免了出现只写了一半的文件。

在实际操作中,我喜欢用Python的tempfile模块创建一个临时目录,然后在里面写文件,写完后再移动文件并删除这个临时目录,这样文件就会使用默认的权限设置。

最后要提的是,在Windows系统上,重命名操作并不完全是原子的,至少在默认设置下,它不允许你直接覆盖旧文件。你需要进行两次重命名,这样就可能出现竞争条件的问题。我不知道在Windows上有什么好的解决方案。

撰写回答