<p>我知道下面的问题不是一个很好的答案,但它非常适合我的需要,而且我没有在其他地方实现它:</p>
<pre><code>from pandas import HDFStore
import os
import time
class SafeHDFStore(HDFStore):
def __init__(self, *args, **kwargs):
probe_interval = kwargs.pop("probe_interval", 1)
self._lock = "%s.lock" % args[0]
while True:
try:
self._flock = os.open(self._lock, os.O_CREAT |
os.O_EXCL |
os.O_WRONLY)
break
except FileExistsError:
time.sleep(probe_interval)
HDFStore.__init__(self, *args, **kwargs)
def __exit__(self, *args, **kwargs):
HDFStore.__exit__(self, *args, **kwargs)
os.close(self._flock)
os.remove(self._lock)
</code></pre>
<p>我用这个作为</p>
<pre><code>result = do_long_operations()
with SafeHDFStore('example.hdf') as store:
# Only put inside this block the code which operates on the store
store['result'] = result
</code></pre>
<p>在同一个存储上工作的不同进程/线程将简单地排队。</p>
<p>请注意,如果您天真地从多个进程操作存储,则最后一次关闭存储将“获胜”,而其他人“认为他们所写的”将丢失。</p>
<p>(我知道我可以让一个进程管理所有的写操作,但是这个解决方案避免了酸洗的开销)</p>
<p><strong>编辑:</strong>现在可以调整“探测间隔”(如果频繁写入,则一秒钟太长)</p>