В программировании это называется concurrency , когда вычисления происходят одновременно, и порядок выполнения не гарантируется. В вашем случае одна программа начинает читать файл до того, как другая программа закончит запись в него. Эта конкретная проблема называется проблемой читателя-писателя и на самом деле довольно часто встречается во встроенных системах.
Есть несколько решений этой проблемы, но самым простым и распространенным является замок . Простейший вид блокировки защищает ресурс от одновременного доступа более чем одной программой. Фактически, он гарантирует, что операции с ресурсом происходят атомарно . Блокировка реализуется как объект, который может быть получен или освобожден (обычно это функции объекта). Программа пытается получить блокировку в al oop, которая повторяется до тех пор, пока программа не получит блокировку. Когда блокировка получена, она предоставляет программе, в которой она находится, возможность выполнить некоторый блок кода (обычно это простой оператор if), после чего блокировка снимается. Обратите внимание, что то, что я называю программой, обычно называется поток .
В Python вы можете использовать объект threading.Lock
. Сначала вам нужно создать объект Lock.
from threading import Lock
file_lock = Lock()
Затем в каждом потоке подождите, чтобы получить блокировку, прежде чем продолжить. Если вы установите blocking=True
, это приведет к тому, что весь поток прекратит работу до тех пор, пока не будет получена блокировка, без необходимости al oop.
file_lock.acquire(blocking=True):
# atomic operation
file_lock.release()
Обратите внимание, что один и тот же объект блокировки должен использоваться в каждом потоке . Вам нужно будет установить блокировку перед чтением и записью в файл, и вам нужно будет снять блокировку после чтения и записи в файл. Это гарантирует, что эти операции больше не произойдут одновременно.