【问题标题】:Stop Python from overwriting the file with Condor jobs阻止 Python 用 Condor 作业覆盖文件
【发布时间】:2017-02-24 22:09:45
【问题描述】:

我尝试执行的 python 代码必须将两个不同的变量写入文件。我正在使用 Condor 来加快我的进程,这意味着 python 代码是同步执行的。我定义的写函数是:

with open('output.txt', 'a') as results_file:
      results_file.write(str(gc_count) + '\n')
      results_file.write(str(length) + '\n')
results_file.close()

但不幸的是,文件以某种方式不断覆盖结果。有人可以帮助我如何使用 Condor 将变量写入文本文件吗?

【问题讨论】:

  • 首先不要results_file.close(),你已经有了一个上下文管理器。然后,即使附加模式,如果您在并行线程/进程中运行此代码,您也需要一个互斥体。
  • 感谢您的建议!你知道我在哪里可以找到一个使用互斥锁的例子吗?
  • 多线程还是多处理?
  • 我使用的是多线程的 THCondor
  • 在这种情况下使用 threading.Lock() 对象。

标签: python condor


【解决方案1】:

即使文件模式设置为追加,文件中的并发写入也会导致数据损坏。

在多线程环境中,您可以使用threading.Lock 对象来保护您的写调用:

import threading
l = threading.Lock()   # l must be a global variable or a member of some class

然后在写的时候,请求锁的权限,写文件的时候释放:

l.acquire()
with open('output.txt', 'a') as results_file:
      results_file.write(str(gc_count) + '\n')
      results_file.write(str(length) + '\n')
l.release()

(另外:你不需要文件上下文管理器中的最后一个close

【讨论】:

  • 非常感谢!现在这也很合乎逻辑,我明白我做错了什么!整个多线程环境的逻辑对我来说不是很清楚。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 2011-01-19
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
相关资源
最近更新 更多