Django - 使文件I / O线程安全

时间:2010-08-28 11:08:15

标签: python django thread-safety

我想以线程安全的方式从文件系统中读取和编写python-source-files。

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

我认为这不是线程安全的,因为request2可以在request1加载并执行之前修改文件。我想实现类似的东西,一个线程在等待另一个线程写入,加载,执行和关闭文件。

2 个答案:

答案 0 :(得分:4)

为什么要让应用程序修改自己的文件?这不仅是令人难以置信的邪恶,元编程难以理解调试的数量级。另外,python会缓存它导入的模块,因此重新加载它并不容易。而且,最后但并非最不重要的是,如果您真的必须执行动态生成的代码,则不必将代码写入文件来执行它。

要回答有关以线程安全方式编写文件的问题,一般惯例是:

  • 将您的内容写入与目标文件位于同一文件系统的临时文件中。
  • 将该临时文件重命名为目标文件,并在此过程中覆盖它。

这是有效的,因为在同一设备上完成时,重命名在POSIX系统上是原子的。因此,其他线程/进程仍将打开旧文件,现在它已从文件系统中分离出来,并且一旦完成这些线程/进程就会被删除,或者它们将打开包含其所有内容的新文件。你避免使用只写了一半的文件。

实际上,我喜欢使用python的tempfile模块创建一个临时目录,并在那里写入文件,然后移动它并删除目录 - 这样就会使用默认的umask创建文件。

最后但并非最不重要的是,重命名在Windows上并不是真正的原子,至少在默认设置下,因为它不会让你覆盖旧文件 - 你需要做两次重命名,这引入了竞争条件的可能性。我不知道Windows的一个很好的解决方案。

答案 1 :(得分:0)

我有类似的问题。在这个问题中查看Erik Karulf的答案:

Django and dynamically generated images

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