Is there a way to prevent two Python programs from executing the same binary at the same time?

997 views Asked by At

I have two Python scripts, that both need at regular intervals (think cronjobs) to call an external program.

If this program (over which we have no control) is called twice simultaneously, data errors occur, so we need to have a way to synchronize calls to this binary.

Is there a way to do this, preferably using only the Python standard library?

1

There are 1 answers

0
James Mills On BEST ANSWER

So without using a 3rd-party library such as filelock you'll have to do something like this:

import os
from subprocess import check_call

if os.path.exists("/var/run/foo.ock"):
    print("Backing off...")
    raise SystemExit(1)

try:
    with open("/var/run/foo.lock", "w"):
        check_call("/path/to/binary")
finally:
    os.remove("/var/run/foo.lock")

The better approach is to use filelock (if you can install 3rd party libraries):

from filelock import FileLock

with FileLock("/path/to/binary"):
    check_call("/path/to/binary")

You can easily install filelock using pip:

$ pip install filelock

See also related: Locking a file in Python

Note: There also seems to be a very similarly named package called lockfile! (Don't confuse the two!)