假设我从公共目录同时启动了大量Python进程。
如果最近修改了Python源文件,解释器将编译.pyc
文件。
如果有多个进程同时尝试为同一个Python源文件构建.pyc
,这是否会造成竞争条件或其他问题?
Python(或cpython
具体)会在编译时保证并发保护吗?
我知道可以用来避免这种情况的方法,我只想了解这个用例是否有问题。
答案 0 :(得分:5)
通常不会,当CPython write bytecode cache file时,它首先写入临时文件,然后move to the desired location with os.replace
。如果OS /文件系统没有在中间崩溃,nodemon.json
使用rename(2)
system call底层,os.replace
是原子的。因此,字节码文件写入是原子的。
恕我直言你应该担心的是字节码缓存文件陈旧检查。 Python使用源文件rename()
(和文件大小)检查缓存文件的新鲜度。需要注意的是,python使用的stat.mtime
分辨率为one second,因此如果一个进程修改了源文件,而另一个进程在同一秒内写入缓存文件,则字节码缓存文件与源代码不一致以后不会刷新。好消息是pep-0552被接受,改为基于散列的缓存文件,这将处理这种情况。