我有一个需要写入文件的类。 我的程序创建了多个这样的类,我想避免写入冲突。 我试图通过使用静态变量来避免它,因此每个类都有一个唯一的文件名。即:
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个工人,所以我实际上无法管理他们之间的通信。
您可以使用uuid之类的东西,如果唯一名称是您所追求的。
编辑:
如果你想要可读但唯一的名称,我建议你考虑用锁保护上面的增量语句,以便只有一个进程在任何时间点增加它,并且可能使文件创建和增量操作原子化。
很简单,只需使用另一个文本文件来保留文件名和您需要识别的数字/代码。您可以使用 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
我正在寻找一种避免写入争用的方法。 然后我意识到为什么不直接使用记录器。可能是一个错误的假设,但我想记录器会负责锁定文件以进行写入。 此外,它在每次写入时都会刷新,因此它满足了该要求。 至于速度,在这种情况下,开销绝对不会影响我。
我发现的另一个解决方案是使用 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