仅在文件不存在时安全地序列化文件 - 避免竞争条件

0 投票
1 回答
928 浏览
提问于 2025-04-18 04:51

我在同时保存很多没有列名的csv文件,这样我就可以用cat命令在unix系统中快速把它们合并在一起。这些csv文件有1000多列,所以我想保存一份列名的副本,以便在重新合并时使用。不过,因为我是在并行创建这些文件,所以我希望只有第一个任务能把pandas的索引对象保存下来。

通常,为了避免在写文件时出现竞争条件,我会使用os.open()。根据这个问题的说法。不过,我尝试在保存时把这个方法结合起来:

cPickle.dump( df.columns, os.open( "/dir/my_columns.pkl", os.O_WRONLY|os.O_CREAT|os.O_EXCL ),-1 )

但是,pickle.dump的第二个参数需要一个可以写入的对象,而os.open()返回的对象并没有这个属性。如果多个线程同时想创建这个对象,有没有其他方法可以安全地保存这个对象呢?

1 个回答

0

你可以使用 os.open 来创建一个新文件,之后用 os.close 关闭它,然后再用 open 重新打开这个文件:

import os
import cPickle

fileName = "/dir/my_columns.pkl"
try:
    # Ensure that only one thread continues beyond this point
    os.close(os.open( fileName, os.O_CREAT|os.O_EXCL ))
except OSError:
    raise RuntimeError(fileName + " could not be created.")

with open(fileName, 'w') as f:
    cPickle.dump( df.columns, f, -1 )

撰写回答