cyberzx 🇷🇺
я тоже его использую для этих целей
Arseny
Так не хочется свой семафор писать.
И совсем не хочется в fast path пользоваться eventfd.
То есть хочется пользоваться eventfd только если действительно нужно ждать.
Arseny
Вообще в результате нужна MPSC очередь, которую можно добавить в epoll
И это как будто совершенно не распространенная структура данных.
🐙 Antony
Сейчас попробую по быстрому рассказать идею:
`
void set_new_value(T value) {
static std::atomic i = 120;
if (i.swap(value) == required_value) {
io_service_instance.post(task_that_must_be_executed_on_condition);
}
}
vladislav
Ребята, такой вопрос. Есть приложуха, которая берёт инфу с N mysql серверов (в среднем на каждом сервере несколько миллионов записей в бд), копирует данные в целевую БД, заполняет дополнительные таблицы на основе этих данных.
Задачи такие:
1) выполнить копирование и перехуячиывание данных в адекватное время
2) поддерживать актуальность данных, т.е если на одной из сорс БД какая-то запись {удалилилась, обновилась, добавилась}, то она должна {удалиться, обновиться, добавиться} и на таргет БД.
Я уверен, что это достаточно распостранённая задача. Как её решать, куда думать, какие есть паттерны?
🐙 Antony
Крылатый
Надо купить и залить в интернеты.
Крылатый
кекекек
🐙 Antony
Еще не вышло :) Сейчас второе чтение - надо исправить недочёты, найденные ревьюерами.
Крылатый
Надо как Ъ пираты спиратить до выхода!
Pavel
Крылатый
🤔
Stanislav
а зачем ждешь? :)
🐙 Antony
Там кстати Glen Fernandes годные замечания сыпет :)
Stanislav
а тьфу, думал Антон пишет 😂
Arseny
Хотя видел, например, такое:
https://github.com/facebook/folly/blob/master/folly/io/async/NotificationQueue.h
🐙 Antony
Arseny
🐙 Antony
таймеры?
🐙 Antony
расскажите поподробнее про проблему
🐙 Antony
постараюсь через пару часов ответить :)
Andrei
Либо если не хочется таймер — пошарить между потоками дескриптор и из продьюсера при записи чего-нибудь в очередь пробуждать epoll по этом дескриптору.
Andrei
eventfd например.
Ivan
Парни, а серваки на gpu есть?
Evgenii
Ivan
Ну коннекты обрабатывать гпц
cyberzx 🇷🇺
а смысл?
cyberzx 🇷🇺
и что ты имеешь в виду под обработкой коннектов? парсинг пакетов?
Ivan
Не знаю
Ivan
Ну да
Ivan
Я просто спросил
cyberzx 🇷🇺
CPU с этим справляется вполне хорошо
Ivan
Ну ок
Andrei
@arseny Вернее я имел в виду, в чём проблема с eventfd? Мы обработали из epoll-а весь io, и прежде чем уснуть проверили очередь, и только если там пусто, пошли в epoll_wait, затем первый же продьюсер, который обнаружил, что очередь пустая, зафайрил eventfd
Ivan
Не, вэб север
Andrei
Если продьюсеры заполняют очередь со скоростью потребления консьюмером, то мы и спать-то собсна на epoll-е не будем.
Крылатый
У гпу нет доступа до туда.
Крылатый
На этом всё.
cyberzx 🇷🇺
Andrei
Можно еще сигнал послать :) Это тоже epoll прервёт.
Andrei
Я вот ничего плохого в записи в eventfd не вижу. Один фиг консьюмера КАК-ТО надо разбудить.
Mikhail
Крылатый
Andrei
Особенно, если epoll в ET режиме.
Крылатый
фаще это оффтоп
Крылатый
Хороший, сознательный гражданин!
Arseny
Если продьюсеры заполняют очередь со скоростью потребления консьюмером, то мы и спать-то собсна на epoll-е не будем.
Ну так да. Если хочется делать write только тогда когда консьюмер действительно ждет, то получается что-то вроде семафора, но внутри не futex, а eventfd.
Меня удивляет, что такой абстракции в библиотеках обычно нет.
Более того, если речь идет о крутой mpsc queue, то интуитивно кажется, что защищать ее снаружи семафором (на futex или eventfd) = терять большую часть ее крутости. Эффективнее должно быть как-то встроить eventfd внутрь очереди. Таких очередей тоже как будто нету.
Andrei
А, стоп, там снаружи локфри mpsc?
Andrei
Тогда грустно довольно, не уверен, что это вообще принципиально возможно скрестить без потерь с epoll-ом.
Arseny
расскажите поподробнее про проблему
Опишу еще раз всю ситуацию
TLDR Откуда брать mpsc queue, которую можно ждать в epoll или почему таких нигде нету?
Есть несколько потоков, в каждом из них крутится epoll.
Потокам нужно слать друг другу сообщения. Когда потоку приходит сообщение он должен пробуждаться из epoll-а.
Разбудить поток можно разными способами: eventfd, pthread_signal, pipe наконец. Пробуждаться каждые x миллисекунд и проверять очередь так себе вариант.
Как именно будить имхо не очень важно, системный вызов и пробуждение потока это уже относительно долго.
Но допустим используется eventfd, как будто созданный именно для этого.
Для отправки сообщений хочется использовать mpsc queue.
При этом ее нужно как-то скрестить с eventfd, чтобы fast path в eventfd не писал вообще.
То есть хочется хочет делать write в eventfd только когда consumer действительно спит в epoll.
Это можно сделать обернув очередь в семафор внутри которого не futex, а eventfd.
Но нигде не видел реализации такого семафора.
Более того интуитивно кажется что оборачивать очередь в семафор не оптимально, оптимальней встроить eventfd в саму очередь.
Но таких очередей тоже что-то не видно.
Berkus
levenshtein?
Arseny
Именно по работе?
Berkus
любой дифф возьми - это оно
Berkus
или OT
Killua
Извраты собеседований, не?
Killua
Потому что давно всё написано.
Arseny
Я как-то вот это реализовывал
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.11.3463
Andre
классическая задача по ДП, извратиться там можно вопросами "а как уменьшить память?"
Killua
В гугле, разумеется.
Arseny
Arseny
Сейчас попробую найти. Там был marathon match на topcoder, там куча реализаций.
Vladislav
Killua
А что не так-то?
Vladislav
А что не так-то?
то, что позиция "алгоритмы нужны только для собеседований и все давно написано" - очень наивная
Killua
Killua
Результатов: примерно 345 000
Killua
Скиньте канал для новичков тогда уж, плз.
Berkus
#supapro
Ivan
Approximate regexp?
Ivan
agrep это ты имел ввиду?