我想以线程安全的方式从文件系统中读取和编写python-source-files。
open("n2.py","w").write(my_new_py_class)
from myproject import n2
#do something with n2
我认为这不是线程安全的,因为request2可以在request1加载并执行之前修改文件。我想实现类似的东西,一个线程在等待另一个线程写入,加载,执行和关闭文件。
答案 0 :(得分:4)
为什么要让应用程序修改自己的文件?这不仅是令人难以置信的邪恶,元编程难以理解调试的数量级。另外,python会缓存它导入的模块,因此重新加载它并不容易。而且,最后但并非最不重要的是,如果您真的必须执行动态生成的代码,则不必将代码写入文件来执行它。
要回答有关以线程安全方式编写文件的问题,一般惯例是:
这是有效的,因为在同一设备上完成时,重命名在POSIX系统上是原子的。因此,其他线程/进程仍将打开旧文件,现在它已从文件系统中分离出来,并且一旦完成这些线程/进程就会被删除,或者它们将打开包含其所有内容的新文件。你避免使用只写了一半的文件。
实际上,我喜欢使用python的tempfile模块创建一个临时目录,并在那里写入文件,然后移动它并删除目录 - 这样就会使用默认的umask创建文件。
最后但并非最不重要的是,重命名在Windows上并不是真正的原子,至少在默认设置下,因为它不会让你覆盖旧文件 - 你需要做两次重命名,这引入了竞争条件的可能性。我不知道Windows的一个很好的解决方案。
答案 1 :(得分:0)