我有一个需要写入文件的类。我的程序创建了这些类的多个,我想避免写冲突。我试图通过使用静态变量来避免它,因此每个类都有一个唯一的文件名。即:
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个工人,所以我实际上无法管理它们之间的通信。
答案 0 :(得分:0)
简单,只需使用另一个文本文件来保存文件名和您需要识别的数字/代码。您可以使用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
答案 1 :(得分:0)
答案 2 :(得分:0)
我真正想要的是一种避免写入争用的方法。然后我意识到为什么不使用记录器。可能是一个错误的假设,但我想象记录器负责锁定文件以进行写入。此外,它会在每次写入时刷新,因此它符合该要求。至于速度,在这种情况下,开销肯定不会影响我。
我发现的另一个解决方案是使用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