Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 18, 2018 10:52:18

rugo
Зарегистрирован: 2018-09-18
Сообщения: 9
Репутация: +  1  -
Профиль   Отправить e-mail  

Одновременный доступ к одному ресурсу

Всем программистам привет.
Делаю для работы небольшую систему мониторинга на Python с отправкой сообщений в Telegram.
Сейчас сделано так.
Есть скрипт отправки сообщений. Этот скрипт запускают другие скрипты, проверяющие различные параметры. Их несколько. Соответственно они передают через командную строку скрипту отправки параметры (ID чата, сообщение). Скрипты, которые что-то проверяют работают асинхронно. И сейчас получается, что в определенные моменты запускается несколько копий скрипта отправки, который пытается отправить сообщения в Telegram. И получается некая путаница в сообщениях, т.к. в это время скрипту не всегда удается отправить сообщения через прокси и он пытается это делать через другой прокси. Т.е. сообщения тоже уходят асинхронно.
Что хочу сделать.
Пусть наверное отправлять сообщения будет один процесс, а скрипты проверяльщики должны как-то информировать его о новых сообщениях.
Т.е. нужен ресурс, в который будут писать сообщения для отправки скрипты проверяльщики и из которого будет читать и отмечать что все отправлено скрипт отправки.
Вообще думаю про SQL (SQLite, MySQL). Но почитал, что там тоже какая-то хитрая схема одновременного доступа к базе для изменения.
Кто-нибудь делал что-то подобное? Наведите на верный и правильный путь. Если SQL, то какую базу брать?

Офлайн

#2 Сен. 18, 2018 11:14:09

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Одновременный доступ к одному ресурсу

То что вы хотите в современном мире реализуется менеджерами очередей. Есть некий процесс который отправляет в очередь сообщение (задачу на выполнение) а есть некий процесс который считывает сообщения из очереди и обрабатывает их. И тех и других количество свободно варьируется в зависимости от задачи. В вашем случае нужен 1 обработчик очереди отвечающей за отправку сообщений в телеграм.
Сейчас де-факто стандарт это RabbitMQ. С его можете начать знакомство, в сети куча информации, да и официальный туториал имеется.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Сен. 18, 2018 11:18:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Одновременный доступ к одному ресурсу

rugo
Т.е. сообщения тоже уходят асинхронно.
Так а зачем это сделано, если это не нужно?

JOHN_16
реализуется менеджерами очередей
Согласен в целом.
Пример использования
http://progerson.ru/1579-ocheredi-soobscheniy-amqp-rabbitmq.htm

Без брокеров сообщений тоже как-то жили раньше.



Офлайн

#4 Окт. 20, 2018 21:31:29

rugo
Зарегистрирован: 2018-09-18
Сообщения: 9
Репутация: +  1  -
Профиль   Отправить e-mail  

Одновременный доступ к одному ресурсу

Спасибо всем за совет использовать Rabbit.
Никак только не могу получать кол-во сообщений в очереди. Не подскажете есть ли какие способы получить данный параметр?

Офлайн

#5 Окт. 21, 2018 07:32:14

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Одновременный доступ к одному ресурсу

rugo
Наведите на верный и правильный путь.
Очереди сообщений RabbitMQ хороши, но когда у вас реальо большая распределенная система. В Вашем случае что вас вынуждает создавать много процессов? У меня сложилось впечатление что так вы проводите разбиение на компоненты.

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

Для синхронизации sqlite не подходит. Mysql Postgresql Могут решить эту задачу, но явно избыточны. Основная задача баз данных - долговременное хранение данных.



Отредактировано doza_and (Окт. 21, 2018 07:38:58)

Офлайн

#6 Окт. 21, 2018 09:37:20

rugo
Зарегистрирован: 2018-09-18
Сообщения: 9
Репутация: +  1  -
Профиль   Отправить e-mail  

Одновременный доступ к одному ресурсу

doza_and
В Вашем случае что вас вынуждает создавать много процессов?
У меня проблема не в том, что много процессов, а в том, что создаваемые процессы асинхронны.
Т.е. главный процесс(процессы) что-то проверяют и запускают другой скрипт, который отправляет в Telegram. Из-за того, что отправка в него идет непредсказуемо, этот процесс идет неопределенное время. И если в это время наступит еще одно событие от главного процесса, то возможна ситуация, когда уведомление от первого события придет позднее второго.
На Rabbit мне удалось всю отправку в Telegram от всех скриптов проверки сделать в одном процессе и строго последовательно. Теперь бы еще победить работу с прокси, но это уже другая задача.

Офлайн

#7 Окт. 21, 2018 17:00:39

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Одновременный доступ к одному ресурсу

rugo
а в том, что создаваемые процессы асинхронны.
Так я вам и предлагаю не создавать много процессов, тогда они не будут асинхронны в силу их отсутствия.



Отредактировано doza_and (Окт. 21, 2018 17:00:58)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version