import time import portalocker # lock files between processes by Jonathan Feinberg def portalock_open(myfilename): myfile = open(myfilename,'r+') # open in rw mode, never write mode ## both LOCK_EX and LOCK_SH wait indefinitely for lock to get acquired ## i.e. if other process has locked file, wait indefinitely ## till lock is released by other process portalocker.lock(myfile,portalocker.LOCK_EX) # try to acquire lock return myfile ## the problem with writing to a file (mylock below) is that in case: ## one program crashes while files are locked, ## the other program will remain blocked from accessing files! ## can catch exceptions, but portalocker seems fine with one file, ## multiple files seem to be an issue with portalocker. ## go with portalocker and one master lockfile: on process exit, lock ends. ## ensure that you have 'clear\n' in locksimfile.txt if running this process first def mylock(myfilename,lockstr): while True: lock_file = portalock_open(myfilename) if 'clear' in lock_file.read(): lock_file.seek(0) # imp: since truncate() removes only from current posn lock_file.truncate() lock_file.write(lockstr) lock_file.flush() portalocker.unlock(lock_file) lock_file.close() break portalocker.unlock(lock_file) lock_file.close() time.sleep(1.0) # don't check too often, wait a second def myunlock(myfilename): lock_file = portalock_open(myfilename) lock_file.truncate() lock_file.write('clear\n') lock_file.flush() portalocker.unlock(lock_file) lock_file.close()