Предотвращение одновременного доступа нескольких скриптов Python к одному файлу - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь создать серию изображений (каждая из которых представляет собой композицию из 12 небольших изображений). Пустые составные изображения и меньшие компонентные изображения уже существуют. Я написал скрипт на python, который добавляет (маленькое) изображение в определенной позиции к каждому (большому) изображению в составной серии. Я хотел бы иметь возможность запускать несколько экземпляров этого скрипта для каждой из 12 позиций одновременно. Однако, когда два экземпляра пытаются выполнить запись в одно и то же составное изображение, одно или оба из составных изображений не смогут присоединиться к составному.

Как предотвратить доступ других экземпляров моего сценария кфайл, к которому в данный момент обращаются?

Я пытался заблокировать файл, но не смог заставить его работать (пример ниже)

import sys
from PIL import Image
import fcntl

small = str(sys.argv[1])      # component image (small)
composite = str(sys.argv[2])  # composite image (large)
x_coord = int(sys.argv[3])    # x-coordinate of small image
y_coord = int(sys.argv[4])    # y-coordinate of small image

img = Image.open(small)
fo = open(composite, 'ab')

while True:
    try:
        # Lock the file if not already in use
        fcntl.flock(fo, fcntl.LOCK_EX | fcntl.LOCK_NB)
        break
    except:
        # If file is locked, wait for it to be unlocked
        print("Drat! It's locked!")
        time.sleep(5.)

comp_img = Image.open(fo)
img = img.resize((500,500))
comp_img.paste(img,(x_coord,y_coord))
comp_img.save(composite)

# Unlock the file for other instances to use
fcntl.flock(fo, fcntl.LOCK_UN)

Я знаю свойиспользование sleep в блоке try-Кроме (и, вероятно, во многих других) является неоптимальным, но я буду беспокоиться об этом, когда смогу заставить его работать

...