[00:20:25] <ada_ru> (I_vlxy_I) https://ayende.com/blog/185859-A/comparing-c-and-rust-network-protocol-exercises
[00:20:33] <ada_ru> (I_vlxy_I) надо чуваку еще Аду насоветовать
[01:23:39] <ada_ru> (insert_reference_here) Кстати, как в Аде с асинхронным программированием?
[01:26:04] <ada_ru> (I_vlxy_I) а с которым именно?
[01:26:24] <ada_ru> (I_vlxy_I) банальная многопоточка через пытреды - тоже асинхронка, так то.
[01:26:29] <ada_ru> (I_vlxy_I) или там через позих какой
[01:28:54] <ada_ru> (nitrocerber) Рандеву - во сне и наяву. Звучит красиво, в высоконагруженных прокси не катит. Чота такоэ
[01:29:03] <ada_ru> (insert_reference_here) отвечает (I_vlxy_I) на <банальная многопоточ…>
Эм, что? Основное преимущество многопоточности как раз в том, чтобы распараллелить обработку ресурсов без потоков
[01:29:37] <ada_ru> (I_vlxy_I) "Основное преимущество многопоточности как раз в том, чтобы распараллелить обработку ресурсов без потоков"
ИДЕАЛЬНО!
[01:29:39] <ada_ru> (I_vlxy_I) РАУНД!
[01:29:53] <ada_ru> (insert_reference_here) отвечает (I_vlxy_I) на <"Основное преимущест…>
Тьфу ты
[01:30:01] <ada_ru> (nitrocerber) Два парасоля этому господину)
[01:30:19] <ada_ru> (insert_reference_here) отвечает (insert_reference_here) на <Эм, что? Основное пр…>
Исправил. Спать уже хочу, вот и сказывается
[01:30:51] <ada_ru> (I_vlxy_I) есть асинхронщина а есть неблокирующие оперции - это два разных господина, так то.
[01:31:08] <ada_ru> (I_vlxy_I) асинхронщина при этом, сама по себе, часто плодит потоки. но не обязательно у тебя. часто в ядре
[01:31:37] <ada_ru> (I_vlxy_I) скажи сразу, что ты хочешь легковесных потоков несистемных и мы тебя простим 🙂
[01:31:49] <ada_ru> (I_vlxy_I) только уточни - с вытесняющей или кооперативной многозадачкой? 🙂
[01:32:35] <ada_ru> (insert_reference_here) отвечает (I_vlxy_I) на <асинхронщина при это…>
Вот с этим не согласен, асинхронщина с успехом работает и на одном треде
[01:32:55] <ada_ru> (insert_reference_here) отвечает (I_vlxy_I) на <скажи сразу, что ты …>
Не хочу, они не компонуются
[01:33:00] <ada_ru> (I_vlxy_I) если брать позикс - то хрен. твой тред будет один, а в ядре будут еще
[01:33:40] <ada_ru> (insert_reference_here) отвечает (I_vlxy_I) на <только уточни - с вы…>
Хех, как вы корутины (в том или ином виде) с вытесняющей многозадачностью сделаете?
[01:34:27] <ada_ru> (I_vlxy_I) легковесные потоки они могут быть такие легковесные, и такие не системные и такой вытесняющей многозадачностью.. а техник разных
[01:34:35] <ada_ru> (I_vlxy_I) возьми, к примеру, ЕРЛАНГ
[01:35:44] <ada_ru> (I_vlxy_I) шедулер можно любой запилить ведь. даже без виртуально машины. особенно если у тебя контроль за котогенератором
[01:35:52] <ada_ru> (I_vlxy_I) и за всем рантаймом
[01:44:07] <ada_ru> (insert_reference_here) отвечает (I_vlxy_I) на <возьми, к примеру, Е…>
А там разве вытесняющая многозадачность?
[01:44:18] <ada_ru> (I_vlxy_I) да. вытесняющая
[01:44:40] <ada_ru> (I_vlxy_I) но забавно реализованная
[01:46:49] <ada_ru> (insert_reference_here) Так всё-таки, что с этой темой в Ada?
[01:47:44] <ada_ru> (I_vlxy_I) дык а ты с темой определись. шашечки, ехать? куда ехать? какие шашечки?
[01:47:51] <ada_ru> (I_vlxy_I) корутины из модулы устроят? 🙂
[01:48:29] <ada_ru> (insert_reference_here) отвечает (I_vlxy_I) на <дык а ты с темой опр…>
А почему я должен выбирать между "шашечки" и "ехать"?
[01:49:11] <ada_ru> (I_vlxy_I) поставь задачу плз.
[01:49:24] <ada_ru> (I_vlxy_I) а нород подумает и скажет как это решается
[01:50:16] <ada_ru> (insert_reference_here) Окей, подумаю
[01:50:19] <ada_ru> (insert_reference_here) Но завтра
[16:44:53] <ada_ru> (Oleg) Приведи пример на другом языке
[16:46:14] <ada_ru> (Oleg) Task я так понимаю не подходит ?
[16:46:37] <ada_ru> (insert_reference_here) отвечает (Oleg) на <Task я так понимаю н…>
Я просто не знаю, как работа с тасками в Ada происходит
[16:47:27] <ada_ru> (Oleg) Я с ними мало работал , и я больше не по x86 но погляжу как будет время
[17:23:55] <ada_ru> (I_vlxy_I) Не нужно решение задачи на другом ЯП, нужна сама задача.
[17:29:50] <ada_ru> (I_vlxy_I) там, не знаю, например обрабатывать 100500 миллионов клиентов через сокеты.
[17:30:08] <ada_ru> (I_vlxy_I) ну, в частном случае - http клиентов. или websocket клиентов
[17:30:56] <ada_ru> (I_vlxy_I) c какой-нибудь не тривиальной логикой работы с каждым из клиентов. например в процессе обработки запроса нужно сходить в базу данных, дернуть еще пару REST-ручек там.
[17:30:59] <ada_ru> (I_vlxy_I) всякое такое
[17:31:44] <ada_ru> (I_vlxy_I) и сильно хочется, чтобы в итоге логика работы обработки реквеста клиента не превратилась в адскую асинхронную лапшу на каллбеках например.
[17:37:57] <ada_ru> (I_vlxy_I) это вот один из возможных примеров постановки задачи, или хотя бы её скопа
[17:45:42] <ada_ru> (Максим) Обзор: Задачи и свойства реального времени · Ada Ru
http://www.ada-ru.org/rat2012/1-3-4
[17:46:12] <ada_ru> (Максим) Немного про задачи в Аде 2012
[17:50:58] <ada_ru> (I_vlxy_I) такой вопрос - а вариадик дженерики бывают?
ну, то есть когда у дженерика переменное число типов которым он параметризуется. может быть один, а может быть 100.
[17:51:22] <ada_ru> (insert_reference_here) отвечает (I_vlxy_I) на <такой вопрос - а вар…>
Вообще — бывают. Не знаю. есть ли в Аде
[17:52:28] <ada_ru> (I_vlxy_I) про вообще - я знаю. тем более что дженерики в разных ЯП называют разные сущности.
[17:52:55] <ada_ru> (I_vlxy_I) дженерики жабы к дженерикам Ады отношения не имеют, равно как и какие-нибудь дженерики в Модуле-3 к адским дженерикам
[17:58:26] <ada_ru> (I_vlxy_I) отвечает (Максим) на <Обзор: Задачи и свой…>
прикольно. прям хочется это всё где-то применить!
[17:58:58] <ada_ru> (I_vlxy_I) но, что-то, ни одной задачи на ум не приходит 😕
[18:01:01] <ada_ru> (I_vlxy_I) зато задача с 10к соединений клиентских которых нужно обрабатывать -- имеется.
печаль.
Хотя, если подумать, по основной работе всё это могло бы пригодиться. Если бы там не были плюсы. 😕
[18:02:16] <ada_ru> (nitrocerber) Есть параметры настройки по умолчанию. Задал первый тип, а соответствующие функции, нужные для настройки у него объявлены - дженерик их всосёт сам.
[18:04:43] <ada_ru> (I_vlxy_I) отвечает (nitrocerber) на <Есть параметры настр…>
ну, это немного не то. я понимаю, что то, что я хочу, скорее всего слишком зубодробильно для Адских дженериков 🙂
[18:04:48] <ada_ru> (insert_reference_here) отвечает (I_vlxy_I) на <зато задача с 10к со…>
Так плюсы 10k соединений могут держать
[18:04:56] <ada_ru> (nitrocerber) А как могёт быть дженерик с "необязательными" параметрами настройки я не очень понимаю... Пахнет пятоном
[18:05:04] <ada_ru> (insert_reference_here) С учётом того, что в новом стандарте есть корутины, это даже может быть удобно
[18:06:00] <ada_ru> (I_vlxy_I) отвечает (insert_reference_here) на <Так плюсы 10k соедин…>
кто угодно может держать. важно как это обрабатывать. по потоку на клиента - фигня получится. асинхронная лапша через libuv тоже такое себе.
ну а нового стандарда еще нет и там вообще пока не ясно что за корутины будут
[18:06:02] <ada_ru> (Максим) И непонятно зачем такие дженерики. Чтобы эти типы уложить в запись?
[18:06:33] <ada_ru> (I_vlxy_I) отвечает (Максим) на <И непонятно зачем та…>
например. или что-то еще с ними сделать.
[18:07:09] <ada_ru> (insert_reference_here) отвечает (I_vlxy_I) на <кто угодно может дер…>
В том-то и дело, что есть
[18:08:04] <ada_ru> (I_vlxy_I) отвечает (insert_reference_here) на <В том-то и дело, что…>
что именно? давай, показывай что есть 🙂 последний раз когда я спрашивал людей из комитета стандартизации, они говорили, что пока даже не понятно до конца будет стеклесс корутины или стекфулл
[18:08:30] <ada_ru> (I_vlxy_I) это было, кажется, с месяц назад.
[18:12:24] <ada_ru> (Максим) в AWS сделано так, есть пул задач воркеров, они по очереди берут сокеты и параллельно обрабатывают запросы
[18:13:15] <ada_ru> (I_vlxy_I) отвечает (Максим) на <в AWS сделано так, е…>
ну вот если обработка запроса клиента требует еще пачки запросов - один запрос в базу, еще 4 запроса по REST-сервисам + файлик прочитать. как это будет выглядеть?
[18:13:33] <ada_ru> (I_vlxy_I) таки лапша калбеков?
[18:16:22] <ada_ru> (Максим) Два варианта. Оба без асинхронности. Простейший - обработчик запроса синхронно будет выполнять все эти действия. Т.е. если это действительно долго, то сервер не будет обрабатывать одновременно больше чем у него задач в пуле.
[18:17:17] <ada_ru> (Максим) Второй - это сождать в обработчике ещё одну задачу, отдать ей сокет, а серверу сказать что сокет пользователь обработает сам.
[18:17:44] <ada_ru> (I_vlxy_I) отвечает (Максим) на <Второй - это сождать…>
задача тут - это же системный тред, скорее всего?
[18:17:50] <ada_ru> (Максим) да
[18:18:01] <ada_ru> (I_vlxy_I) это ж очень тяжеловесно. 10к или 100к клиентов не обработать
[18:18:16] <ada_ru> (Максим) мне кажется асинхронностью реально в Аде никто не проблемался, кроме Ману - https://github.com/briot/Ada-promises
[18:18:49] <ada_ru> (Максим) 100к тяжёлых запросов вообще не обработать 😄
[18:18:58] <ada_ru> (I_vlxy_I) возможно что-то можно было бы изобразить через генераторы из Ады 2020, если их примут. но это такоэ...
[18:19:21] <ada_ru> (I_vlxy_I) отвечает (Максим) на <100к тяжёлых запросо…>
смотря что под тяжестью понимать 🙂
[18:21:40] <ada_ru> (I_vlxy_I) сходить в 10 баз и сделать 300 REST запросов это не тяжесть, так то.
[18:21:54] <ada_ru> (insert_reference_here) отвечает (Максим) на <мне кажется асинхрон…>
Странно выглядит
[18:22:25] <ada_ru> (I_vlxy_I) отвечает (insert_reference_here) на <Странно выглядит>
нормально выглядит. для Адской сферы важен реалтайм, а не 1000кк клиентов обрабатывать.
[18:22:30] <ada_ru> (insert_reference_here) > Dot notation with generic class wide operations
А вот это не понял. Какие ограничения на обобщённые классы в Ada?
[18:22:38] <ada_ru> (I_vlxy_I) реалтайм ембеддед задачи имеют сильно иную специфику же
[18:23:31] <ada_ru> (Максим) Dot notation это когда пишешь Object.Method
[18:23:56] <ada_ru> (I_vlxy_I) классвайд -- это не обобщенные классы, так то
[18:24:03] <ada_ru> (I_vlxy_I) то есть не генерики
[18:24:20] <ada_ru> (insert_reference_here) Окей, я не шарю. Что есть class wide?
[18:24:36] <ada_ru> (Максим) class wide это когда у тебя Object типа Type'Class
[18:24:48] <ada_ru> (I_vlxy_I) так стало сильно понятней 😄
[18:24:52] <ada_ru> (Максим) т.е. может быть любым поомком от Type
[18:25:21] <ada_ru> (I_vlxy_I) короче, в Аде юзание таблицы виртуальных функций оно всегда ЯВНО
[18:25:24] <ada_ru> (I_vlxy_I) вот
[18:25:53] <ada_ru> (I_vlxy_I) это видно через сигнатуры типов
[18:25:56] <ada_ru> (insert_reference_here) отвечает (I_vlxy_I) на <короче, в Аде юзание…>
Логично
[18:26:04] <ada_ru> (Максим) Ну если Circle потомок Shape, то Shape'Class включает в себя все типы унаследованные от Shape, в том числе и Circle
[18:26:39] <ada_ru> (I_vlxy_I) если в плюсах чтобы дернуть конкрутный метод, забив на виртуальность, нужно специально постараться, то в Аде - это скорее наоборот.
[18:26:48] <ada_ru> (insert_reference_here) отвечает (Максим) на <Ну если Circle потом…>
Как это работает? В общем случае всех наследников класса перечислить можно только в конкретном проекте
[18:27:00] <ada_ru> (Максим) generic class wide это наверное когда такой тип передается в настраиваемый модуль как параметр
[18:27:15] <ada_ru> (insert_reference_here) отвечает (I_vlxy_I) на <если в плюсах чтобы …>
Разве? template <typename T> и вперёд
[18:27:32] <ada_ru> (I_vlxy_I) отвечает (insert_reference_here) на <Разве? template <typ…>
забудь про шаблоны и дженерики сейчас plz 🙂
[18:27:36] <ada_ru> (I_vlxy_I) не про них речь
[18:27:47] <ada_ru> (Максим) Работает через таблицу виртуальных функций
[18:28:00] <ada_ru> (I_vlxy_I) сейчас про динамический полиморфизм, так сказать
[18:29:14] <ada_ru> (I_vlxy_I) берем плюсцы:
struct A {virtual void foo();}
struct B : A {void foo();}
int main() {
A* a = new B();
a->foo(); // вот тут нужно сильно постараться, чтобы дернуть A::foo()
}
[18:29:48] <ada_ru> (insert_reference_here) отвечает (Максим) на <generic class wide э…>
То есть вариант обобщённого модуля, что ли?
[18:30:06] <ada_ru> (Максим) Короче, он хочет писать P.When_Done (A).When_Done (B) но не может
[18:30:39] <ada_ru> (insert_reference_here) отвечает (Максим) на <Короче, он хочет пис…>
А на это есть фундаментальные ограничения? Или это особенности текущей реализации?
[18:30:54] <ada_ru> (I_vlxy_I) сейчас мясо из плюсов и Ады:
struct A {virtual void foo();}
struct B : A {void foo();}
int main() {
A'Class* a = new B();
a->foo(); // дернется B::foo
A* aa = new B(); // допустим это Ада
aa->foo(); // дернется A::foo
}
[18:31:54] <ada_ru> (I_vlxy_I) отвечает (insert_reference_here) на <А на это есть фундам…>
это стандарт. реализаций Ады много
[18:32:07] <ada_ru> (insert_reference_here) отвечает (I_vlxy_I) на <сейчас мясо из плюсо…>
То есть ограничения на вариантность, понятно
[18:32:45] <ada_ru> (I_vlxy_I) просто банально ты четко указываешь хочешь ты через этот указатель звать функции через таблицу виртуальных функций, или не хочешь
[18:32:57] <ada_ru> (I_vlxy_I) в плюсах же это нужно делать при каждом вызове функции.
[18:34:37] <ada_ru> (I_vlxy_I) о, кажется я аж сам понял, что такое class wide типы 🙂
[18:58:40] <ada_ru> (Oleg) :-)
[21:17:50] <ada_ru> (I_vlxy_I) Аццкий подход мне даже тут чем-то нравится.
[23:49:22] <ada_ru> (insert_reference_here) отвечает (I_vlxy_I) на <кто угодно может дер…>
Немного напутал, да, пока нету. Но корутины утвердили вроде
https://www.reddit.com/r/cpp/comments/au0c4x/201902_kona_iso_c_committee_trip_report_c20/
[23:50:53] <ada_ru> (I_vlxy_I) отвечает (insert_reference_here) на <Немного напутал, да,…>
там вроде как есть уверенность и твёрдое намерение их принять в этом стандарте, но при этом детали могут еще сильно измениться.
[23:51:04] <ada_ru> (I_vlxy_I) короче, пользоваться можно будет года через три в новых проектах.
[23:51:17] <ada_ru> (I_vlxy_I) (в проде, экспериментально то хоть сейчас)
[23:51:18] <OCTAGRAM> не лучше ли легковесные потоки?
[23:52:45] <ada_ru> (I_vlxy_I) а что такое легковесные потоки?
[23:52:46] <OCTAGRAM> корутины — это как легковесные потоки, только надо ещё их вручную планировать
[23:52:46] <ada_ru> (insert_reference_here) отвечает на <(OCTAGRAM) не лучше …>
А какая разница?
[23:53:03] <ada_ru> (I_vlxy_I) имеешь в виду вытесняющую многозадачность для них?
[23:53:05] <OCTAGRAM> легковесные потоки вручную планировать не надо
[23:53:11] <ada_ru> (I_vlxy_I) это очень часто оверкилл.
[23:53:45] <ada_ru> (I_vlxy_I) то есть, по хорошему то, нужно чтобы это все настраивалось: стеклесс/стекфулл и кооперативка/вытесняловка
[23:53:54] <OCTAGRAM> да и с вытесняющей ручной планировщик ставит потолок их возможностям
[23:54:12] <ada_ru> (I_vlxy_I) первые две штуки - под вопросом. ибо у стеклесс и стекфулл интерфейсы сильно разные.
[23:54:34] <ada_ru> (insert_reference_here) отвечает (I_vlxy_I) на <первые две штуки - п…>
Стекфулл ещё и жирный рантайм нужен
[23:54:52] <ada_ru> (I_vlxy_I) неа. не нужен жирный. со стекфулл другие проблемы
[23:55:16] <ada_ru> (insert_reference_here) отвечает (I_vlxy_I) на <неа. не нужен жирный…>
Ну а как ты ещё будешь стеками переменной длины управлять?
[23:55:17] <ada_ru> (I_vlxy_I) (из за которых и склоняются к стеклесс в плюсах)
[23:55:29] <ada_ru> (I_vlxy_I) стекфулл прибить сложно.
[23:55:40] <ada_ru> (I_vlxy_I) а вот стеклесс - легко и однозначно прибиваются
[23:55:56] <ada_ru> (I_vlxy_I) это основные трудности со стекфулл корутинами
[23:55:58] <OCTAGRAM> stackless, может быть, единственное, зачем именно корутины нужны
[23:56:22] <OCTAGRAM> кому очень надо, может найти мюC++
[23:57:05] <OCTAGRAM> там как раз корутины препроцессором запиливаются, и опционально монитором защищаются (кормонитор)
[23:57:05] <ada_ru> (I_vlxy_I) так то стекфулл успешно народ юзает в принципе. но пока весьма ограниченно собственно из за того, что их не поубивать.
[23:57:34] <OCTAGRAM> а что значит, не поубивать? вытеснение пресловутое?
[23:58:15] <ada_ru> (I_vlxy_I) снять задачу извне. kill ей сделать. совсем. навсегда.
[23:58:47] <OCTAGRAM> abort который?
[23:58:54] <ada_ru> (I_vlxy_I) стекфул корутины есть в бусте например.
[23:59:58] <OCTAGRAM> что-то там было принципиально хуже CPC