假设我从公共目录同时启动了大量Python进程.
如果最近修改了Python源文件,则解释器将编译.pyc文件.
如果有多个进程同时尝试.pyc为同一个Python源文件构建一个,那么这会创建竞争条件还是其他问题?
Python(或cpython特别)会在编译时保证并发保护吗?
我知道可以用来避免这种情况的方法,我只想了解这个用例是否有问题.
一般没有,当CPython 写入字节码缓存文件时,它首先写入临时文件,然后移动到所需的位置os.replace.os.replace使用rename(2)系统调用底层,rename()如果OS /文件系统没有在中间崩溃,则是原子的.结果字节码文件写入是原子的.
恕我直言你应该担心的是字节码缓存文件陈旧检查.Python使用源文件stat.mtime(和文件大小)检查缓存文件的新鲜度.需要注意的是,mtimepython使用的分辨率是一秒,因此如果一个进程修改了源文件,而另一个进程在同一秒内写入缓存文件,则字节码缓存文件与源不一致,以后不会刷新.好消息是pep-0552被接受,改为基于哈希的缓存文件,这将照顾这种情况.