写入HDF5文件时获取独占锁

时间:2016-12-19 21:57:02

标签: python

我有以下代码尝试将pandas数据帧附加到HDF5商店。我尝试获取独占文件锁,以便多个进程/线程/作业不会立即写入HDF5文件:

 #--------------------------------------------- MODULE IMPORT ----------------------------------------------------------#
    import os
    import time
    from pandas import HDFStore

 #--------------------------------------------- DEVELOPMENT CODE -------------------------------------------------------#
    class SafeHDF5Store(HDFStore):
        """Implement safe HDFStore by obtaining file lock. Multiple writes will queue if lock is not obtained."""

        def __init__(self, *args, **kwargs):
            """Initialize and obtain file lock."""

            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 IOError:
                    time.sleep(interval)

            HDFStore.__init__(self, *args, **kwargs)

        def __exit__(self, *args, **kwargs):
            """Exit and remove file lock."""

            HDFStore.__exit__(self, *args, **kwargs)
            os.close(self._flock)
            os.remove(self._lock)

    def write_hdf(f, key, df, complib):
        """Append pandas dataframe to hdf5.

        Args:
        f       -- File path
        key     -- Store key
        df      -- Pandas dataframe
        complib -- Compress lib 

        NOTE: We use maximum compression w/ zlib.
        """

        with SafeHDF5Store(f, complevel=9, complib=complib) as store:
            df.to_hdf(store, key, format='table', append=True)

接下来,我在计算服务器场上启动100个作业。他们做一些计算来生成数据帧。然后他们尝试将他们的数据框附加到此表。但是,在尝试获取我不知道如何解决的锁时,我收到以下错误。有什么建议吗?

File "/safehdf5.py", line 27, in __init__
    self._flock = os.open(self._lock, os.O_CREAT | os.O_EXCL | os.O_WRONLY)
OSError: [Errno 17] File exists: 'osd.hdf5.lock'

当另一个进程尝试创建锁文件时,锁文件似乎已经存在(而持有锁的进程尚未完成删除该文件)。我在 exit()函数中有一个 os.remove()调用来删除该文件。

1 个答案:

答案 0 :(得分:2)

在第29行的bootstrap.properties内,只有__init___()才能获得锁定:

IOError

但是,如果该文件已经存在,则会得到while True: try: self._flock = os.open(self._lock, os.O_CREAT | os.O_EXCL | os.O_WRONLY) break except IOError: time.sleep(interval) 。 因此,除了两种类型的错误并继续尝试,直到你成功:

OSError