
Ned Ogl
09.01.2018
10:30:19

Evgeny
09.01.2018
10:31:30
Фигассе, кто-то еще диски записывает. У меня в компе даже привода дисков нет, ибо нафиг не нужен.

Ned Ogl
09.01.2018
10:33:32
Это была цепочка шуток в контексте "альтернативная семантика терминов негативной окраски". LSD, алкоголь, итд
А так да, чё, го бухать

Google

Evgeny
09.01.2018
10:34:12
Комбобрейкер! ?

Ned Ogl
09.01.2018
10:35:14
Как и с флудом

Evgeny
09.01.2018
10:35:47
Не, от флуда еще никто не умирал. Как и от LSD кстати :)

Pavel
09.01.2018
10:38:16
У vibe core естественно нет документации нифига. Изучай наощупь по исходникам ?

Ned Ogl
09.01.2018
10:39:12

Evgeny
09.01.2018
10:41:41

Pavel
09.01.2018
11:47:21
Я снова пару часов вчера писал на Дэ и у меня уже бомбило
От того как все геморойно )
Вообще, это документация от старого vibe.d.core а не от нового vibe-core, в котором как утверждается много чего переделано изнутри. Потом, совершенно нету примеров как работать с асинхронным файбером. Есть в сорцах класс файбер но он final. Как так-то? Через что тогда его создавать? Фабрика? Неявно через делегат?
Если я хочу допустим породить некий асинхронный таск, но меня воротит от написания портянок анонимных функций. Я хочу представить этот процесс как класс у которого есть метод run() или что-то типа того.

Evgeny
09.01.2018
11:54:19

Google

Evgeny
09.01.2018
11:55:50
Vibe оперирует не напрямую файберами, а Task-ами

Pavel
09.01.2018
11:57:41
Task там это структура которую не отнаследуешь ?
private this(TaskFiber fiber, size_t task_counter) вот у нее конструктор

Evgeny
09.01.2018
11:59:24
Зачем ее наследовать? Если так уж сильно хочется ООП (хотя оно тут не нужо), то написать класс-обертку - дело нескольких минут.

Pavel
09.01.2018
11:59:43
И непонятно, то ли мне надо самому ТаскФибер создавать, то ли есть уже создаватель, то ли чего.

Evgeny
09.01.2018
12:00:06
runTask или runWorkerTask

Pavel
09.01.2018
12:00:24
Обертка да, но это же оверхед. Вот надо чтобы такие вещи были освещены в документации
Что типа "работать с классами не рекомендуем"

Evgeny
09.01.2018
12:00:46

Pavel
09.01.2018
12:01:03
У меня оно не premature

Evgeny
09.01.2018
12:01:50
Крайне маловероятно, что этот микрооверхед будет узким местом вашего приложения.
Структура Task - это что-то вроде идентификатора процесса
воспринимайте его как PID

Pavel
09.01.2018
12:03:08
Так вот, runTask может принимать инстанс таска а не адрес функции ?

Evgeny
09.01.2018
12:03:29
Нет она принимает адрес функции или делегата

Pavel
09.01.2018
12:03:34
Мне не нужно сразу запускать таск, мне надо его создать, проинициализировать данными, и потом только пускать.

Evgeny
09.01.2018
12:04:39
А в чем проблема? Сначала инициализируй данные, а потом стартуй runTask-ом

Pavel
09.01.2018
12:04:39
А в лямбдах я уже напарывался на такой забавынй баг когда там области видимости пересекаются, переменные вовремя не уничтожаются и все летит к чертям :)

Google

Evgeny
09.01.2018
12:05:08
Хочется обернуть все в класс? Пример набросать?

Pavel
09.01.2018
12:05:56

Evgeny
09.01.2018
12:06:08
Про баг в лямбдах - нужен тесткейс. Такие баги надо исправлять поскорее

Pavel
09.01.2018
12:06:31

Evgeny
09.01.2018
12:06:41

Pavel
09.01.2018
12:06:48
Может тут даже кто вспомнит как мы это обсуждали.

Evgeny
09.01.2018
12:07:27
Больше ничего документировать не нужно. По крайней мере в доках. Я например не оборачиваю все это добро в классы
Скрипеть там кстати нечего пример очень короткий, сейчас накидаю

Pavel
09.01.2018
12:08:06
Надо оборачивать в классы. Это же ООП язык :)
Так получается понятней.
Короче в итоге я хочу отрефакторить свою проксю на high-perfomance low-memory вариант, без GC и с крутым понятным кодом. И чтобы еще была красивая документация. Вот это будет win!
Кстати для betterC нету event-loop. А то может я бы на нем писал.

Igor
09.01.2018
12:10:42
Так можно взять libuv и к нему обращаться

Evgeny
09.01.2018
12:10:59
Надо оборачивать в классы. Это же ООП язык :)
Не обязательно. Дешка мультипарадигменная. Можно писать в функциональном стиле. Или вперемежку. Я лично давно переболел ООП головного мозга и перестал плодить классы на каждый чих.
class MyTask {
Task task;
void start() {
task = runTask(&run);
}
void run() {
}
}
как-то так
Наследуйся, оверридь функцию run и наслаждайся ООП, если считаешь, что так лучше.
Оверхед стремится к нулю.

Maxim
09.01.2018
12:17:15
в любом случае, как говорят умные люди, композиция лучше, чем наследование)

Pavel
09.01.2018
12:17:54
Эта борьба с GC превратилась в настоящий ад

Google

Evgeny
09.01.2018
12:18:17

Pavel
09.01.2018
12:18:23
Где-то nogc где-то gc где-то кастомные аллокаторы, свои или из стандартной библиотеки. Просто жесть.
У меня была отличная прокся, никакой сраной асинхронности, вайба. На каждый коннект создаешь new Thread() И фигачишь в нем. Счастье.
Ну правда stop-the-world имеет место быть, раз уж я все так легко делал

Igor
09.01.2018
12:21:26
На каждый коннект тред - это для средних нагрузок

Maxim
09.01.2018
12:21:27
переключение между потоками достаточно тяжелая вещь, отчасти из-за этого появились всякие корутины и файберы

Pavel
09.01.2018
12:21:52
Я вот делал бенчмарки кстати и не такая уже эта вещь тяжелая
Где-то на 30-40% медленнее чем файберы

Admin
ERROR: S client not available

Maxim
09.01.2018
12:22:07
а в свете подарков новогодних, теперь это будет еще тяжелее)

Evgeny
09.01.2018
12:22:15

Pavel
09.01.2018
12:22:35

Evgeny
09.01.2018
12:24:28
Дык разницы почти никакой. Данные инкапсулируются в структуру (ну или в класс, если сильно нужен полиморфизм), и вызывается runTask, как я написал выше. А лучше runWorkerTask, чтобы все потоки утилизировать.

Pavel
09.01.2018
12:25:17
Но вообще, цель то была доказать что на D можно элегантно писать эффективные программы. Чтобы эту проксю можно было тихонько запустить на каком-нибудь роутере с 128мб памяти и она молча и быстро делала свое дело.

Evgeny
09.01.2018
12:25:36
а что за прокся? HTTP?

Pavel
09.01.2018
12:25:41
socks5

Maxim
09.01.2018
12:25:56
кстати, в свете существования UFCS, часто наследование и не нужно бывает для синтаксического сахара)

Pavel
09.01.2018
12:26:05
При подгрузке вайба размер релизного бинарника вырос с 2.2мб до 4 мб что тоже не радует.

Evgeny
09.01.2018
12:26:46
В случае с вайбом не нужно создавать никаких тасков, он сам его создает в listenTCP

Google

Pavel
09.01.2018
12:27:26
О с этим тоже вчера напоролся, оказывается внутренняя вызываемая лямбда должна быть @safe nothrow

Evgeny
09.01.2018
12:27:44

Pavel
09.01.2018
12:29:04
ЩИТО?
https://github.com/vibe-d/vibe-core/blob/master/source/vibe/core/net.d#L117

Evgeny
09.01.2018
12:30:05
а, это новенькое сонке нагородил
помешались на своих @safe
ну nothrow легко сделать, обернуть все в try-catch
c @safe тоже борьба проста - @trusted

Pavel
09.01.2018
12:33:33
> тоже
> борьба
> проста
?
dlang - ни минуты без борьбы!
(но простой)

Evgeny
09.01.2018
12:33:59
ты еще с shared видимо не бодался, вот где борьба так борьба :)

Pavel
09.01.2018
12:34:15
Да у меня был спринт в августе
Ну там я на все грабли почти наступил.

Maxim
09.01.2018
12:35:19
в принципе, я их с @safe nothrow вполне понимаю)
все же сделано для того, чтобы код был гарантированно безопасным и не падал внезапно

Evgeny
09.01.2018
12:35:54
Я лично так и не смог его нормально осилить. Садишься такой, думаешь, ща все по александревсковски культурно шаредами покроешь. Потом приходит понимание, что shared придется пихать буквальнл везде. И шлешь это дело нахуй.

Maxim
09.01.2018
12:36:21
другое дело, что это можно обойти всякими @trusted и не париться, но это уже сам себе злобный буратина

Evgeny
09.01.2018
12:37:22

Maxim
09.01.2018
12:38:10
в принципе, тоже вариант, тут, я так понимаю, проблему переложили с создателя либы на пользователя либы
что, в принципе, тоже верно
потому что пользователь либы где-то у себя, на каком-то уровне абстракции должен знать, что делать с исключением
в общем, это из разряда холиварных архитектурных решений, но ясно, откуда ноги растут)