Как читать и писать один и тот же файл одновременно в python - PullRequest
4 голосов
/ 20 февраля 2020

Существует три python программы, программа записи (writer.py) записывает в файл output.txt и две программы чтения (reader_1.py, reader_2.py), считывающие с одного и того же output.txt file одновременно.

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

Я пытался реализовать механизм блокировки fnctl, но этот модуль не найден в моем python.

writer.py

#!/usr/bin/python
import subprocess
import time

cycle = 10

cmd="ls -lrt"

def poll():
   with open("/home/output.txt", 'a') as fobj:
      fobj.seek(0)
      fobj.truncate()
      try:
          subprocess.Popen(cmd,  shell=True,  stdout=fobj)
      except Exception:
          print "Exception Occured"

# Poll the  Data
def do_poll():
    count = int(time.time())

    while True:

        looptime = int(time.time())

        if (looptime - count) >= cycle:
             count = int(time.time())
             print('Begin polling cycle')
             poll()
             print('End polling cycle')

def main():
    do_poll()

if __name__ == "__main__":
    main()

reader_1.py

#!/usr/bin/python

with open("/home/output10.txt", 'r') as fobj:
   f=fobj.read()

print f

reader_2.py

#!/usr/bin/python

with open("/home/output10.txt", 'r') as fobj:
   f=fobj.read()

print f

Примечание: reader_1.py и reader_2.py работает непрерывно, пока l oop. По этой причине к одному и тому же файлу обращаются три программы одновременно.

Поиск идей.

Решение № 1: Добавлен механизм блокировки fnctl в программу writer.py. Но не уверен, что это эффективно блокирует файл.

#!/usr/bin/python
import subprocess
import time
import os
import fcntl, os

report_cycle = 2

cmd='ls -lrt'

def poll(devnull):
   with open("/home/output10.txt", 'a') as fobj:
      try:
         fcntl.flock(fobj, fcntl.LOCK_EX | fcntl.LOCK_NB)
      except IOError:
          print "flock() failed to hold an exclusive lock."

      fobj.seek(0)
      fobj.truncate()

      try:
         subprocess.call(cmd, shell=True,  stdout=fobj, stderr=devnull)
      except Exception:
          print "Exception Occured"

      # Unlock file
      try:
           fcntl.flock(fobj, fcntl.LOCK_UN)
      except:
            print "flock() failed to unlock file."
...