当且仅当它不存在时安全地腌制文件 - 避免竞争条件

时间:2014-04-30 07:50:51

标签: python python-2.7 pickle race-condition

与此同时,我节省了很多没有列名的csv,因此我可以使用cat在unix中快速将它们组合在一起而不将它们组合在一起。这些csv有1000多列,所以当我重新聚合时,我想保存列标题的单个副本,但因为我是并行创建这些文件,所以我只想要第一个工作来解决这些问题。 pandas index object。

通常,为了在编写文件时避免竞争条件,我会根据this question使用os.open()。但是,我试图在酸洗时将它结合起来:

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

但是pickle.dump的第二个参数需要一个带有write属性的参数,但os.open()返回的对象没有属性。如果多个线程竞相创建它,是否有一种替代方案可以让我安全地保存这个对象?

1 个答案:

答案 0 :(得分: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 )