Andrei
Строжайший NDA
Sergey
Строжайший NDA
ты не с яндекса случайно? 😄
Andrei
Это стало core-либой в одной компании, которая занимается HFT
Andrei
Не.
Andrei
Хедж-фонд.
Andrei
Который 10% дневного оборота на фондовых рынках в РФ проворачивает.
Sergey
Ты на boost context с нуля корутины делал? или готовые брал?
Andrei
Лол.
Andrei
Ни то, ни другое.
Andrei
Я их вообще с нуля делал.
Andrei
Буст контекст в 2014 еще работал очень хуёво. Только время на него потратил.
Andrei
Не знаю как сейчас.
Andrei
Мне надо было сдлеать кросплатформенные кортуины.
Andrei
Под виндой это были файберы. На линуксе это был ucontext_t
Andrei
И соотв. вызовы.
Andrei
На маке ни того, ни другого, пришлось написать на ассемблер гет и сет контекстов.
Sergey
понятно. и много времени на это всё ушло?
Andrei
20 нс на контекст свитч зато.
Andrei
Где-то 4 месяца from scratch
Andrei
Я писал для мака и линукса и второй разработчик для винды.
Andrei
В итоге был библиотека корутин, совмещенная с асинхронным ио
Andrei
IOCP в винде, epoll в линуксе и kqueue в Mac
Andrei
Довольно забавно видеть было выступление Гора Нишанова в 2016 году с его TcpConnection классом на корутинах и await-ах, когда ты сам это уже писал два года назад.
Sergey
Ну вот, теперь ты меня смутил. Тоже хочу корутины. Только готовые) пойду смотреть boost
Andrei
Но это стейтфул корутины. Они конечно всё равно быстрые, 20 нс, как я уже сказал, но это не зиро-оверхед.
Andrei
Есть настоящий зиро-оверхед, но его только компилятор может сделать.
Andrei
Это следующий шаг и гораздо более непростой, но я вот как раз этим занят :D
Andrei
Разрабатываю дизайн языка для одного проекта стороннего, где будут корутины из коробки стейтлесс в компиляторе.
Крылатый
Крылатый
Там ещё быстрей.
Крылатый
Чучуть, но шустрей Intel.
Dmitriy / დიმიტრი
Кто-нибудь с epoll и сокетами работал тут? Это нормально будет, если я создам cпомощью epoll_create(1) один epoll дескриптор и из кучи потоков подпишусь на него через epoll_wait?
Dmitriy / დიმიტრი
На стэке пишут что ок, но как-то это ненадёжно выглядит
Dmitriy / დიმიტრი
http://stackoverflow.com/questions/12481245/epoll-wait-on-several-threads-faster
Andrei
Это ок.
Andrei
Хотя вопрос в чём?
Andrei
Да, epoll_wait тредсейфный.
Dmitriy / დიმიტრი
Хотя вопрос в чём?
меня вот это просто насторожило "and be careful about synchronisation"
Andrei
А, ну смотри, ты разницу межде edge-triggered и level-triggered понимаешь?
Andrei
Эдж срабатывает по фронту сигнала, левел срабатывает и держится пока сигнал есть.
Andrei
В данном случае сигнал — это готовность сокета.
Andrei
еполл это очередь.
Andrei
Если у тебя ET, то ты вытащишь из еполла гарантированно один раз.
Andrei
сокет
Andrei
А вот если LT
Andrei
То может случить и так, что два треда вытащат один и тот же сокет.
Andrei
Естественно предполагается, что у тебя O_NONBLOCK сокеты.
Dmitriy / დიმიტრი
👍спасибо. А нельзя сделать так что бы дескрипторы которые попали в один тред оставались только там? Т.е. я подписался через epoll на сокет, он мне насоздавал соединений. Я прочитал из сокетов и решил в них записать данные. Но готовность на запись может прийти в другой поток ведь так?
Andrei
Да, это так.
Andrei
А что, ты хочешь чтобы у тебя тред простаивал, пока не будет доступна запись?
Andrei
В чем выигрыш от еполла тогда?
Andrei
Он не для такой архитектуры :)
Dmitriy / დიმიტრი
У меня просто такой алгоритм: 1. клиент отправляет данные 2. Подсчитывается хэш сумма и отправляется в ответе клиенту. Думаю через одно соединение это сделать как раз ок
Andrei
Понятно, ну ты всегда можешь удалить из еполла свой сокет.
Dmitriy / დიმიტრი
А что, ты хочешь чтобы у тебя тред простаивал, пока не будет доступна запись?
Ну не совсем простаивал, просто тред бы обрабатывал другие события, а при появлении события на запись залазил бы в локальный объект(хэш мап), вытаскивал оттуда данные отправлял их и закрывал соединение
Andrei
Бррр.
Andrei
Ты хочешь от треда слишком много.
Andrei
Тебе пришло соединение, тред прочел данные и начал считать хеш.
Andrei
Он в этот момент занят, так?
Dmitriy / დიმიტრი
Ага, получается что так. Я херню сказал)
Dmitriy / დიმიტრი
Наверное, лучше разбить треды на несколько групп? Один принимает соединения, другой читает, третий пишет?
Andrei
Еще лучше их сделать корутинами :D
Andrei
Но да.
Andrei
Лучше пусть твоя долгая операция подсчета хеша не смешивается с чтением и записью данных.
Dmitriy / დიმიტრი
Эх. Я просто подумал что раз epoll thread-safe, то я всю эту штуку без блокировок как-то смогу сделать :D
Andrei
Ты можешь.
Andrei
Но не через тот же epoll/
Andrei
Ты забрал сокет из еполла. вызвал epoll_ctl или как он там и удалил свой сокет оттуда.
Andrei
дальше запустил подсчет хеша
Andrei
хеш посчитался, сокет уже твой, можеш перевести его в блокирующий режим и отправить как обычно.
Andrei
ИЛИ
Andrei
заведи внтури треда еполл и сложи туда.
Andrei
И обрабатывай следующее соединение.
Andrei
просто с отправкой данных на самом деле обычно проще.
Andrei
Если это именно хеш, то это несколько байт.
Andrei
Быстрее всего было бы сделать read, который едва ли заблокируется, потому что данные лягут в буфер системный
Andrei
И потом сразу сделать send 0
Andrei
и close на сокете.
Dmitriy / დიმიტრი
заведи внтури треда еполл и сложи туда.
Типа завести epoll на ожидание готовности к записи?
Andrei
Да.