- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个长时间运行的进程,它在一个文件中写入了很多东西。结果应该是一切或什么都不是,所以我正在写入一个临时文件并在最后将其重命名为真实名称。目前,我的代码是这样的:
filename = 'whatever'
tmpname = 'whatever' + str(time.time())
with open(tmpname, 'wb') as fp:
fp.write(stuff)
fp.write(more stuff)
if os.path.exists(filename):
os.unlink(filename)
os.rename(tmpname, filename)
我对此不满意有几个原因:
有什么改进我的代码的建议吗?有图书馆可以帮助我吗?
最佳答案
您可以使用 Python 的 tempfile
模块为您提供一个临时文件名。它可以以线程安全的方式创建一个临时文件,而不是使用 time.time()
来创建临时文件,如果同时在多个线程中使用,它可能会返回相同的名称。
正如在对您的问题的评论中所建议的,这可以与上下文管理器的使用相结合。通过查看 Python tempfile.py
源代码,您可以了解如何实现您想要执行的操作。
下面的代码片段可能会做你想做的。它使用从 tempfile
返回的对象的一些内部结构。
os.path.exists()
和 os.rename()
之间没有单独的检查,这可能会引入竞争条件。对于 Linux 上的原子重命名,源和目标必须在同一文件系统上,这就是此代码将临时文件与目标文件放在同一目录中的原因。RenamedTemporaryFile
类的行为应该类似于 NamedTemporaryFile
,除非使用上下文管理器关闭它,文件会被重命名。示例:
import tempfile
import os
class RenamedTemporaryFile(object):
"""
A temporary file object which will be renamed to the specified
path on exit.
"""
def __init__(self, final_path, **kwargs):
tmpfile_dir = kwargs.pop('dir', None)
# Put temporary file in the same directory as the location for the
# final file so that an atomic move into place can occur.
if tmpfile_dir is None:
tmpfile_dir = os.path.dirname(final_path)
self.tmpfile = tempfile.NamedTemporaryFile(dir=tmpfile_dir, **kwargs)
self.final_path = final_path
def __getattr__(self, attr):
"""
Delegate attribute access to the underlying temporary file object.
"""
return getattr(self.tmpfile, attr)
def __enter__(self):
self.tmpfile.__enter__()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type is None:
self.tmpfile.delete = False
result = self.tmpfile.__exit__(exc_type, exc_val, exc_tb)
os.rename(self.tmpfile.name, self.final_path)
else:
result = self.tmpfile.__exit__(exc_type, exc_val, exc_tb)
return result
然后你可以像这样使用它:
with RenamedTemporaryFile('whatever') as f:
f.write('stuff')
在写入过程中,内容进入一个临时文件,退出时文件被重命名。此代码可能需要一些调整,但总体思路应该可以帮助您入门。
关于python - 线程安全和容错文件写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12003805/
我有一个具有以下架构的网站: End user ---> Server A (PHP) ---> Server B (ASP.NET & Database)
是否有认证或某些权威来决定软核是否具有容错性? 另一个问题。我已经看到 LEON3-FT 只有在 RTAX Actel FPGA 上实现时才具有耐辐射性。那正确吗? 打扰一下,但我对此感到困惑,因为有
我正在使用 Data.Aeson 将一些 JSON 解析为 Record 类型。不时将数据添加到 JSON 中,这会破坏我的代码,因为 Aeson 会提示以下内容: expected Object w
我对分区模式下的 Ignite Cache 有几个问题 1)当Ignite集群中的节点发生故障时,如果故障节点是某个 key 的主节点,那么该节点的备份是否会成为新的主节点? 2) 故障节点中的备份副
我正在深入研究 Akka只是看着他们的 fault tolerance example ,并试图理解它。 为什么我不能在“纯 Java”中实现所有相同类型(Worker、Listener、Counte
Apache Kylin 看起来是一个很棒的工具,可以满足大量数据科学家的需求。这也是一个非常复杂的系统。我们正在开发一个内部解决方案,其目标完全相同,即具有低查询延迟的多维 OLAP 多维数据集。在
我需要将目录从一个集群复制到另一个具有类似 HDFS 的集群(两者都是 MAPR 集群)。 我计划使用 DistCp Java API。但我想避免目录中文件的重复副本。我想知道这些操作是否容错?也就是
有没有人拥有/制造/销售用于 .NET 的容错 XML 阅读器? 是的,我知道,XML 的设计目的不是为了在其中包含错误,如果它无效就应该被拒绝......等等等等。但遗憾的是,现实世界是不完美的,开
我试图在 akka Actors 中获得容错行为。我正在编写一些代码,这些代码依赖于系统中的 Actor 可用于长期处理。我发现我的处理在几个小时后停止(大约需要 10 小时)并且没有发生太多事情。我
我有兴趣了解 Spark 如何实现容错。在他们的paper他们描述了他们如何为“狭窄的依赖关系”做这件事,比如相当简单的 map 。但是,我没有说明如果节点在像排序操作这样的广泛依赖性之后崩溃时他们会
我目前正在通过离线访问在 Android 上实现 Google+ 身份验证。这需要请求一个一次性授权代码,该代码可以发送到服务器并兑换为刷新 token 。到目前为止一切顺利。 然而,假设在兑换代码和
我需要解析一个没有根元素、命名空间声明和实体声明的 xml block ,尽管包括所有这三个元素。 到目前为止,我一直在使用 Dom4j 并对内容进行一些包装,但不断出现新的实体和 namespace
我有一个 23 节点集群,在 AWS 上跨 4 个可用区运行 CoreOS Stable 681.2.0。所有节点都在运行 etcd2 和 flannel。在 23 个节点中,8 个是专用的 etcd
在我的办公室,我们正在使用 (https://docs.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher?view=netframe
我是一名优秀的程序员,十分优秀!