Я пытаюсь создать серию изображений (каждая из которых представляет собой композицию из 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-Кроме (и, вероятно, во многих других) является неоптимальным, но я буду беспокоиться об этом, когда смогу заставить его работать