общий поток файлов и блокировка с помощью fcntl - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь реализовать процессы производитель-потребитель (не потоки) в python, где производитель P генерирует данные, а два потребителя C1 и C2 используют эти данные.Данные должны быть прочитаны только после того, как их часть была записана, например, в конце каждой строки.

Один из способов осуществить передачу данных - использовать общий файл, называемый «Pout.txt».и связанный файл блокировки 'Pout.lock':

def acquire(fname):
    try:
        fd = open(fname, 'w')
        fcntl.lockf(fd, fcntl.LOCK_EX) # dont use LOCK_NB
        return fd
    except OSError:
        return None

def release(fd):
    try:
        fcntl.lockf(fd, fcntl.LOCK_UN)
        fd.close()
    except OSError:
        return None

P:
    open('Pout.txt', 'a')
    while True:
        # ... generate some data ...
        fd = acquire('Pout.lock')
        # ... append data to Pout file ...
        release(fd)

C1 and C2:
    open('Pout.txt', 'r')
    while True:
        fd = acquire('Pout.lock')
        # ... read data from Pout file ...
        release(fd)

У меня есть пара вопросов об этой реализации:

(1) Я открываю и закрываю файл блокировки 3 раза заданные, может быть, в общей сложности миллион раз.Создаст ли это проблемы с эффективностью операционной системы Linux, и есть ли вероятность перебоев в работе системы из-за этого?

(2) Данные Pout на самом деле потоковые, поэтому данные, которые когда-то читал Ci, будутникогда не читайте это снова.Но приведенная выше реализация будет постоянно увеличивать размер файла, а это пустая трата дискового пространства.Есть ли лучший способ для потоковой передачи общих данных между параллельными процессами в Python?

...