Существует три 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."