我试图找出一个单线程 Python 程序中问题的根本原因,该程序基本上是这样的(高度简化):
# Before running
os.remove(path)
# While running
if os.path.isfile(path):
with open(path) as fd:
...
我基本上看到了不稳定的行为,当文件不存在时isfile(它使用stat,它本身GetFileAttributesExA在 Python 2.7 的引擎盖下使用,请参见此处)可以返回,下一次调用失败。Trueopen
path在 SMB3 网络共享上,我怀疑某种缓存行为。是否有可能GetFileAttributesExA返回过时的信息?
将 SMB 客户端缓存从默认(10s)减少到 0s 似乎使问题消失了:
Set-SmbClientConfiguration -DirectoryCacheLifetime 0 -FileInfoCacheLifetime 0
(注意:这里的正确解决方法是try打开文件并捕获异常,当然,但我对这个问题感到困惑,想了解根本原因。)