Python — обновление конфигурации во время выполнения скрипта

#python

#python

Вопрос:

У меня есть скрипт на Python, который постоянно опрашивает данные. Скрипт постоянно выполняется и никогда не должен останавливаться.

Скрипт запрашивает данные из набора ключевых слов, которые передаются ему при первом запуске скрипта.

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

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

Комментарии:

1. Сохраните конфигурацию в виде словаря, затем просто сбросьте и загрузите через json.

Ответ №1:

Лучше инкапсулировать этот файл настроек в базу данных. Достаточно простого файла базы данных SQLite — поддержка SQLite встроена в Python, поэтому никаких дополнительных усилий не требуется.

Преимущество базы данных в том, что вы не столкнетесь с условиями гонки частично записанных файлов и т.д. Скрипт «добавление конфигурации» добавляет ключевые слова с использованием транзакции, а другой скрипт, считывающий данные из базы данных, увидит это только тогда, когда это будет полностью выполнено. Просто помните, что не следует постоянно держать базу данных открытой в периодическом скрипте. Раз в некоторое время открывайте его, читайте ключевые слова и закрывайте.

Комментарии:

1. Я тоже поддержал это решение, но я думаю, что мой ответ требует меньше кодирования для достижения того же результата.

2. Если бы я запускал этот скрипт каждые 5-10 секунд, имело бы смысл закрывать базу данных по-прежнему?

3. @Hanpan: закрытие базы данных SQLite является обязательным, я думаю, независимо от вашего периода. В любом случае, 5-10 секунд — это вечность, относительно, так что не беспокойтесь об этом

Ответ №2:

Опрос файла конфигурации не является беспорядочным, но является очень распространенным решением этой проблемы. Вы должны согласиться с этим.

Комментарии:

1. В зависимости от размера файла, операционной / файловой системы и других факторов, я бы сказал, что это рецепт для условий гонки. Я рекомендую простую базу данных вместо обычного файла

Ответ №3:

Если вы используете Linux, вы можете попробовать pyinotify. Вот пример.

Ответ №4:

Я согласен с данными трека, хранящимися в файле, затем использую модуль signal, чтобы сообщить вашему скрипту, что новые данные трека готовы к чтению, привяжите функцию, скажем, к SIGUSR1, и все готово, нет риска частично записанных файлов.

В вашем скрипте поместите:

 import signal

signal.signal(signal.SIGUSR1, read_track_data)
  

затем (способ Linux, но будет сильно отличаться в Windows) просто отправьте сигнал вашему скрипту сразу после обновления файла данных вашего трека.

 $kill -n 10 PID_OF_YOUR_SCRIPT
  

Комментарии:

1. Мне бы хотелось увидеть решение «не сильно отличающееся в Windows» 😉

2. @Eli: вот почему я люблю Linux ^^

3. Я тоже люблю Linux, но вам действительно следует удалить это утверждение, если вы не готовы поддержать его

4. @Eli: Я отредактировал ответ, я не подразумевал, что в Windows возможно отправлять сигналы типа `SIGUSR1′, просто что там есть альтернативы, такие как сообщения Win32, вызовы удаленных процессов или другие. Я согласен, это не так просто.

5. ОК. Просто для справки, в Windows я бы не пошел по этому пути. Если бы у меня было что-то против опроса, я бы использовал уведомление сокета. В Python также не слишком много кода

Ответ №5:

Вы можете обмениваться данными с обоими скриптами с помощью сокетов