Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Ожидание данных


Автор: admsasha 16.3.2020, 11:32
Требуется написать демон, который будет считывать данные с базы и производить определенные действия. Каким образом можно узнать, что в базе есть новые строки не делая ежесекундно запросы типа "select .. where checked=1" ? Использую DBI (mysql). В базу данные попадают через CGI скрипт (с сайта) который находится на том же сервере, что и данный демон.

Автор: arto 16.3.2020, 15:51
а какую задачу вы хотите решить таким образом?

Автор: Bulat 16.3.2020, 16:05
Цитата(admsasha @  16.3.2020,  11:32 Найти цитируемый пост)
 Каким образом можно узнать, что в базе есть новые строки не делая ежесекундно запросы типа "select .. where checked=1"

Не делая ежесекундно запросы вообще или не делаю запросы ежесекундно типа "..." ?

Автор: admsasha 17.3.2020, 04:18
Цитата(Bulat @  16.3.2020,  23:05 Найти цитируемый пост)
Не делая ежесекундно запросы вообще или не делаю запросы ежесекундно типа "..." ?
 Не делая ежесекундно запросы вообще. Например, если бы я написал на c++ и всё это было в одном процессе, но в разных потоках, я бы использовал std::condition_variable и это бы решило мою задачу (не знаю на сколько понятен мой пример). А тут разные процессы.

Добавлено через 1 минуту и 11 секунд
Цитата(arto @  16.3.2020,  22:51 Найти цитируемый пост)
а какую задачу вы хотите решить таким образом?
 Не понял вопроса. Не тыркать базу лишний раз, не нагружать CPU ненужными запросами.

Автор: Bulat 17.3.2020, 08:08
Цитата(admsasha @  16.3.2020,  11:32 Найти цитируемый пост)
 который будет считывать данные с базы и .... не делая ежесекундно запросы


Вот мне самому интересно, как считывать данные с базы, не делая туда запросы?  smile 

Автор: admsasha 17.3.2020, 09:18
Цитата(Bulat @  17.3.2020,  15:08 Найти цитируемый пост)
Вот мне самому интересно, как считывать данные с базы, не делая туда запросы?   

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

Автор: Bulat 17.3.2020, 09:24
Цитата(admsasha @  17.3.2020,  09:18 Найти цитируемый пост)
Вопрос не в том, чтобы вообще не делать, а не делать их постоянно. Как бы ожидать сигнала от второго скрипта, который скажет, что в базу данные поступили, можешь считывать их.


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

Мне кажется тут надо саму архитектуру проекта пересмотреть и не "изобретать велосипед"..  smile 

Автор: admsasha 17.3.2020, 10:04
Цитата(Bulat @  17.3.2020,  16:24 Найти цитируемый пост)
 А если у тебя второй скрипт сам будет почти ежесекундно кидать данные в базу?
 Значит ежесекундно читать базу. В реальности это будет происходить раз в 30-60 минут. Но обработка нужна сразу.

Добавлено через 29 секунд
Цитата(Bulat @  17.3.2020,  16:24 Найти цитируемый пост)
и не "изобретать велосипед"..  
 Поэтому я и задал вопрос

Добавлено через 3 минуты и 5 секунд
Цитата(Bulat @  17.3.2020,  16:24 Найти цитируемый пост)
Сообщения между двумя скриптами - можно и через сокеты и даже через те же сигналы попробовать..
 Ну вот это уже ближе

Автор: Bulat 17.3.2020, 10:09
Цитата(admsasha @  17.3.2020,  10:04 Найти цитируемый пост)
Значит ежесекундно читать базу. В реальности это будет происходить раз в 30-60 минут. Но обработка нужна сразу.

Ну так скрипт, который записывает данные в базу, сам запускает скрипт, который эти данные считывает, не делая регулярных запросов!

Автор: admsasha 17.3.2020, 10:25
Цитата(Bulat @  17.3.2020,  17:09 Найти цитируемый пост)
Ну так скрипт, который записывает данные в базу, сам запускает скрипт, который эти данные считывает, не делая регулярных запросов!
 это CGI скрипт, он должен быстро отдать ответ, что "запрос принят". А дальше идет уже реальная работа

Автор: Bulat 17.3.2020, 10:43
Цитата(admsasha @  17.3.2020,  10:25 Найти цитируемый пост)
 это CGI скрипт, он должен быстро отдать ответ, что "запрос принят". А дальше идет уже реальная работа


Тогда CGi-скрипт раз в 30-60 минут запускает скрипт, который записывает данные в базу - если работа скрипта завершена без ошибок - то считаем, что данные успешно записаны и быстро отдаем ответ!

Автор: alezzz 17.3.2020, 12:16
admsasha, держи в memcached ключ "есть/нет данные", читай его ежесекундно, если архитектура сложно меняется.

Автор: Bulat 17.3.2020, 14:37
Цитата(alezzz @  17.3.2020,  12:16 Найти цитируемый пост)
держи в memcached ключ "есть/нет данные"

Так сложно  smile а не проще тогда будет просто файл создавать? Есть данные - "не пустой" файл, нет данных - файл с размером 0 байт. Частота проверки размера файла - гораздо выше, нежели остальные способы, там в секунду больше одного раза можно проверить  smile 

Автор: alezzz 17.3.2020, 15:34
Не, файл - это обращение к диску, мне спокойнее к памяти обращаться.

Добавлено через 8 минут
хотя... если что-то простое, не сильно замороченое, то можно и файле флаг держать

Автор: Bulat 17.3.2020, 15:54
Цитата(alezzz @  17.3.2020,  15:34 Найти цитируемый пост)
хотя... если что-то простое, не сильно замороченое, то можно и файле флаг держать

в memcached у тебя ключи, значения и т.п. А мой способ - это даже не "флаг в файле", а "свойство файла как флаг". Есть данные - файл с размером 1 байт, нет данных(по умолчанию) файл с размером 0 байт. Причем для определения свойства совсем не обязательно "открывать" данный файл(хэндл и все такое) - достаточно считать размер файла специальной функцией из файловой системы...

memcached еще надо устанавливать и т.п. А здесь все готовое - pure perl

Автор: arto 17.3.2020, 16:12
Цитата(alezzz @  17.3.2020,  15:34 Найти цитируемый пост)
Не, файл - это обращение к диску, мне спокойнее к памяти обращаться.

use /dev/shm

Автор: alezzz 17.3.2020, 16:16
Ни разу не пользовался, надо будет попробовать, да и это линоксовые примочки, а у меня и FreeBSD не мало.

Автор: arto 18.3.2020, 08:37
емнимс, у freebsd есть своя имплементация tmpfs

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)