【问题标题】:Safely pickle a file if and only if it does not exist - avoiding a race condition当且仅当文件不存在时才安全地腌制文件 - 避免竞争条件
【发布时间】:2014-04-30 07:50:50
【问题描述】:

同时,我保存了很多没有列名的 csv,因此我可以使用 cat 在 unix 中快速将它们组合在一起,而无需将它们组合在一起。这些 csv 有 1000 多列,所以我想保存一个列标题的副本,以便在重新聚合它们时使用,但是因为我正在并行创建这些文件,所以我只希望第一个工作来腌制熊猫索引对象。

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

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

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

【问题讨论】:

  • 为避免竞争条件,锁定文件以进行写入,完成后释放锁定。并且不要打开这样的文件,尤其是在您处理多个线程试图打开同一个文件的情况下。使用with 语句。
  • 我认为您的问题是如何从文件描述符创建文件对象。或者如何将标志传递给open 函数。

标签: python python-2.7 pickle race-condition


【解决方案1】:

您可以使用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 )

【讨论】:

    猜你喜欢
    • 2012-06-14
    • 1970-01-01
    • 2015-01-30
    • 2010-09-25
    • 1970-01-01
    • 2014-01-29
    • 2010-09-25
    • 2019-06-12
    相关资源
    最近更新 更多