【问题标题】:New file for each instance creation每个实例创建的新文件
【发布时间】:2014-05-20 13:45:41
【问题描述】:

我有一个需要写入文件的类。我的程序创建了多个这样的类,我想避免写冲突。我试图通过使用静态变量来避免它,因此每个类都有一个唯一的文件名。即:

class Foo:
    instance_count = 1

    @staticmethod
    def make():
        file_name = Foo.instance_count + '-' + 'file.foo'
        Foo.instance_count += 1
        Foo(file_name)

    def Foo(self, fname):
        self.fname = fname

这在某种程度上有效,但在可能并行创建类的情况下无效。我怎样才能使它更健壮?

编辑
我的用例在我的应用程序中创建了这个类,由 gunicorn 提供服务。所以我用 gunicorn 启动我的应用程序,假设有 10 个工人,所以我实际上无法管理他们之间的通信。

【问题讨论】:

  • 实际上,您能否再解释一下您的用例:当您说并行时,您的意思是什么?

标签: python file static-variables


【解决方案1】:

很简单,只需使用另一个文本文件来保存文件名和您需要识别的数字/代码。您可以使用 JSON、pickle 或仅使用您自己的格式。

__init__ 函数中,您可以读取文件。然后,根据您获得的信息制作一个新文件。

文件示例:

File1.txt,1
Fil2e.txt,2

还有__init__ 函数:

def __init__(self):
    counter = int(open('counter.txt', 'r').read()[-2:].strip())
    with open("File%d.txt"%counter+1, "w"):
         #do things
    #don't forget to keep the information of your new file

【讨论】:

  • 你能详细说明你的意思吗?
  • 这会不会有同样的问题,他们试图同时从 counter.txt 中读取?
  • @riotburn 并非如此,除非它们是在完全相同的时间创建的。他们在工作时会使用不同的文件。
【解决方案2】:

如果您追求的是唯一名称,则可以使用 uuid 之类的名称。

编辑:

如果您想要可读但唯一的名称,我建议您考虑用锁保护上面的增量语句,以便在任何时间点只有一个进程在增加它,并且还可能创建文件和增量操作原子。

【讨论】:

  • @riotburn 我在上面添加了一个建议。
  • 虽然这是一个很好的答案,但在我的例子中,类的创建来自于通过 gunicorn 产生多个工人,所以我不确定如何让他们交流。
  • 我认为您将不得不使用一种结合了互斥锁和持久存储(@allKid 建议的文件)的解决方案,其中最后创建的文件名被写入。
【解决方案3】:

我真正想要的是一种避免写争用的方法。然后我意识到为什么不只使用记录器。可能是一个错误的假设,但我想记录器会负责锁定文件以进行写入。此外,它会在每次写入时刷新,因此它满足该要求。至于速度,在这种情况下开销肯定不会影响我。

我找到的另一个解决方案是使用 tempfile 类。这将为类的每个实例创建一个唯一的文件。

import tempfile as tf

class Foo:

    @staticmethod
    def make():
        file_name = tf.NamedTemporaryFile('w+',suffix="foofile",dir="foo/dir")
        Foo(file_name)

    def __init__(self, fname):
        self.fname = fname

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    相关资源
    最近更新 更多