У меня есть несколько процессов Python, которые контролируют и действуют на физический ввод-вывод. Например. выключите двигатель, если ток слишком велик. Они должны сообщить друг другу, почему они что-то сделали, поэтому я подумал, что общий файл может быть простым решением. Различные процессы могут записывать в этот файл, а другие должны знать, когда он был записан. Я уже использую ConfigObj для статических файлов конфигурации, поэтому я решил попробовать его для динамических файлов. Запись не должна происходить очень часто, возможно, не более одной в секунду и обычно намного медленнее, чем это. Я придумал этот пример, который, кажется, работает.
import copy
import os.path
import threading
import time
from configobj import ConfigObj
class config_watcher(threading.Thread):
def __init__(self,watched_items):
self.watched_items = watched_items
self.config = self.watched_items['config']
super(config_watcher,self).__init__()
def run(self):
self.reload_config()
while 1:
# First look for external changes
if self.watched_items['mtime'] <> os.path.getmtime(self.config.filename):
print "external chage detected"
self.reload_config()
# Now look for external changes
if self.watched_items['config'] <> self.watched_items['copy']:
print "internal chage detected"
self.save_config()
time.sleep(.1)
def reload_config(self):
try:
self.config.reload()
except Exception:
pass
self.watched_items['mtime'] = os.path.getmtime(self.config.filename)
self.watched_items['copy'] = copy.deepcopy(self.config)
def save_config(self):
self.config.write()
self.reload_config()
if __name__ == '__main__':
from random import randint
config_file = 'test.txt'
openfile = open(config_file, 'w')
openfile.write('x = 0 # comment\r\n')
openfile.close()
config = ConfigObj(config_file)
watched_config = {'config':config} #Dictionary to pass to thread
config_watcher = config_watcher(watched_config) #Start thread
config_watcher.setDaemon(True) # and make it a daemon so we can exit on ctrl-c
config_watcher.start()
time.sleep(.1) # Let the daemon get going
while 1:
newval = randint(0,9)
print "is:{0} was:{1}, altering dictionary".format(newval,config['x'])
config['x'] = newval
time.sleep(1)
openfile = open(config.filename, 'w')
openfile.write('x = {0} # external write\r\n'.format(randint(10,19)))
openfile.close()
time.sleep(1)
print "is {1} was:{0}".format(newval,config['x'])
time.sleep(1)
У меня вопрос: есть ли лучший / более легкий / чистый способ сделать это?