我遇到了一个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次。
如何确保发生以下情况:
else
部分)正在发生,它将等待;所有其他并发调用都将进入等待状态。/tmp/corners.txt
存在),它将被加载。答案 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.'