python:在并发独立调用中写入一次文件

时间:2015-09-30 19:36:26

标签: python concurrency

我遇到了一个python脚本的多个并发调用,包括在文件中初始化和加载一些系统信息。

这种初始化只发生一次,当它发生时,其他调用必须以某种方式等待。当发生这种情况时,其他调用必须继续读取文件。但是,由于正在进行未知数量的程序并发调用,因此多次输入该部分会导致问题。

这是我的代码:

#initialization has already happened, load info from file
if os.path.isfile("/tmp/corners.txt"):
    logging.info("corners exist, load'em up!")

    #load corners from cornersfile
    cornersfile=open("/tmp/corners.txt","r")
    for line in cornersfile:
        corners.append((line.split()[0], line.split()[1]))`
    cornersfile.close()
    logging.info("corners is %s", corners)

else:
    # initialize and do not let other concurrent invocations to proceed!
    logging.info("initiation not done, do it!")
    #init blocks and return the list of corners
    #write corners to file
    cornersfile=open("/tmp/corners.txt", "w")
    cornersfile.write("\n".join('%s %s' % x for x in corners))
    cornersfile.close()

我做了一些同时运行代码8次的测试。在日志中,我看到代码的第一部分输入了三次,else部分输入了5次。

如何确保发生以下情况:

  1. 如果任何并发调用发现初始化(else部分)正在发生,它将等待;所有其他并发调用都将进入等待状态。
  2. 如果任何并发调用发现初始化已经发生(即文件/tmp/corners.txt存在),它将被加载。

1 个答案:

答案 0 :(得分:0)

我知道有几个python解释器正在运行。你没有使用线程。

我会用文件锁定解决这个问题。有一个图书馆:https://pypi.python.org/pypi/lockfile

示例:

from lockfile import LockFile
lock = LockFile("/some/file/or/other")
with lock:
    print lock.path, 'is locked.'