Обработка общего XML-файла между PHP и Python - PullRequest
0 голосов
/ 25 марта 2019

Я работаю над проектом в Raspberry Pi Zero с apache в качестве веб-сервера.Веб-сайт на PHP и на основе пользовательских данных обновляет XML-файл на сервере.Существует также программа Python, работающая параллельно с веб-сервером.Эта программа на Python постоянно читает XML и извлекает значения из XML, хранит их локально и проверяет их на наличие изменений, и, если есть какие-либо изменения, она выполняет некоторую связь UART с внешними устройствами, иногда на основе этой внешней связи с устройствами, также Pythonобновляет XML.

Python читает XML каждые 2 секунды, и иногда возникает проблема, когда питон выполняет операцию чтения, если пользователь вводит ввод и если PHP вставляет новое значение в тот же XML,сбой питона.Клиент хочет уменьшить задержку в 2 секунды до .1 секунды, что означает, что Python будет читать быстро, и любые изменения в PHP приведут к сбою.

Есть ли способ получить некоторую блокировку файла между Python и PHPтак что, когда Python читает или пишет, PHP ожидает и, если PHP пишет, Python ожидает.Приоритет отдается Python над PHP.

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Было бы лучше сначала сделать вызов API, который бы подсказывал, изменяются ли данные в настоящее время и когда были изменены последние данные. Таким образом, вы можете избежать сбоя, который происходит из-за совместного использования ресурса

0 голосов
/ 25 марта 2019

Вы можете избежать чтения каждые 2 секунды, просто проверьте, изменился ли файл, чем выполнять чтение или запись в этот файл.Это несколько оптимизированный способ.

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler


class MyHandler(FileSystemEventHandler):
    def on_modified(self, event):
        print(f'event type: {event.event_type}  path : {event.src_path}')


if __name__ == "__main__":
    event_handler = MyHandler()
    observer = Observer()
    observer.schedule(event_handler, path='YOUR_DIR_PATH_TO_WATCH', recursive=False)
    observer.start()

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

Или поделитесь своим кодом и ошибкой.Чтобы быть более понятным.

...