@dlangru

Страница 52 из 719
Nick
15.08.2016
09:09:05
хотя и отрабатывает логику

при 11т вместо 10т корутин потребление памяти практически в 2 раза больше

Oleg
15.08.2016
09:19:59
что такое корутины?

мои знания ограничиваются 3-мя концепциями: процессы (по сути программа) потоки (единица управления многопоточностью для системы) зелёные потоки — fiders (они находятся внутри одного потока и блокировка одно заблокирует всё остальное в потоке)

Google
Oleg
15.08.2016
09:23:57
соответственно создание и уничтожение потоков это накладно (переход в режим ядра), а fiber не накладно (чисто пользовательский код)

файберы можно плодить тысячами, а потоки не имеет смысла

потому что физически всё-равно будет исполняться параллельно не более количества процессоров

Мерлин
15.08.2016
09:25:11
Разве файберы в D блокирующие?

Oleg
15.08.2016
09:25:13
гипертрейдинг от интела это аппаратные файберы по сути

а как они могут быть не блокирующими?

поток при io блокируется системой

Nick
15.08.2016
09:26:47
пока сделал навскидку тест по созданию практически пустых spawn-еных функций

00001 5mb 01000 15mb 02000 44mb (+29) 03000 75mb (+31) 04000 89mb (+14) 05000 109mb (+20) 06000 119mb (+10) 07000 138mb (+19) 08000 153mb (+15) 09000 198mb (+45) 10000 213mb (+15) 11000 222mb (+9) 11500 174mb (-48) 12000 вылетает в OwnerTerminated

Oleg
15.08.2016
09:27:08
spawn это поток

это 12000 * 2 переключений ОС в режимы ядра и обратно

Nick
15.08.2016
09:27:37
я думаю да, исходя из того что он возвращает Tid

Oleg
15.08.2016
09:27:51
и зачем их столько?

Google
Oleg
15.08.2016
09:28:29
в vibe организованно норм в этом плане

создаётся оптимальное кол-во потоков и на каждый поток пулы файберов

Мерлин
15.08.2016
09:30:57
а как они могут быть не блокирующими?
Ну вот например в го горутины неблокирующие

Nick
15.08.2016
09:31:58
spawn тоже вроде как, стараются использовать наработки по чистоте функций и неизменности данных

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

Oleg
15.08.2016
09:35:15
Nick
15.08.2016
09:36:18
ясненько, значит их имеет смысл делать не больше количества процессоров, верно?

Oleg
15.08.2016
09:36:35
ну +\-

всё-таки это не железное правило

Nick
15.08.2016
09:37:13
по поводу spawn Александреску писал: "Вследствие последних усовершенствований аппаратного и программ­ного обеспечения D решил отойти от других императивных языков: да,язык D поддерживает потоки, но они не разделяют никакие изменяе­мые данные по умолчанию - они изолированы друг от друга. Изоляция обеспечивается не аппаратно (как в случае с процессами) и не с помо­щью проверок времени исполнения; она является естественным следст­вием устройства системы типов D."

Oleg
15.08.2016
09:37:52
ну там он слукавил немного

ну как минимум строка 522 того же файла

Dmitry
15.08.2016
09:38:19
спауны где полезны?

Oleg
15.08.2016
09:38:34
auto spawnTid = Tid( new MessageBox );

не shared new

когда 2 года назад воткнулся во что-то сильно (с массивами в многопоточности было связанно: arr ~= elem не работал, хотя arr = arr ~ elem работал) стал копать внутрь этого модуля

и обнаружил, что они сами обходят это ограничение типов для этого messagebox и ещё каких-то мелочей

спауны где полезны?
чтобы понимать что и где полезно нужно понимать для чего это нужно

spawn полезен при многопоточном программировании

создаётся поток + messagebox

Google
Oleg
15.08.2016
09:42:08
общаешься с другим потоком через разделяемую очередь с блокировками

а как ты это уже применять будешь — другой вопрос

Dmitry
15.08.2016
09:43:05
тоесть там где нужны потоки с разделяемыми данными?

Oleg
15.08.2016
09:43:21
нет

вообще философия потоков в D как-бы намекает, что разделяемые данные это плохо

и в случае spawn ты отправляешь в другой поток так называемые сообщения, которе из себя могут представлять как простые типы, так и пользовательские структуры без данных, которе нельзя копировать правильно за один подход (указатель на область памяти просто не скопировать)

Мерлин
15.08.2016
09:45:49
Share by communicating, not communicating by sharing

Nick
15.08.2016
10:00:37
таким образом если мне нужно организовать "полную" занятость процессоров то нужно создать соответствующее количество потоков (Thread) исполнения и для абстрагирования от оборудования нагрузить эти потоки через некий менеджмент файберами (Fiber) и более простого пути тут нет?

как было сказано vibe.d реализует такой механизм, верно?

жаль, так верилось в волшебную пилюлю )

в го насколько помню в рекламации зазывают свободными от ограничений горутинами которые вроде и не надо менеджерить по процессорам

Dmitry
15.08.2016
10:04:46
Олег, а простые потоки получается между собой общаться не могут?

Макс
15.08.2016
10:10:58
стоп, а родные Thread как по этой правильной классификации называются? не потоками?

Nick
15.08.2016
10:15:46
нашёл такое сравнение thread/fiber https://octarineparrot.com/article/view/getting-more-fiber-in-your-diet

Nick
15.08.2016
10:23:15
Oleg всё же не совсем так судя по описанию: The type of concurrency used when logical threads are created is determined by the Scheduler selected at initialization time. The default behavior is currently to create a new kernel thread per call to spawn, but other schedulers are available that multiplex fibers across the main thread or use some combination of the two approaches.

https://dlang.org/library/std/concurrency.html

код конечно говорит за себя ) но идея ширше чем ядрёные потоки

и шедулер в комплекте есть как я понимаю https://dlang.org/library/std/concurrency/scheduler.html

Google
Nick
15.08.2016
10:26:26
думается мне, что всёже создание через spawn с настройкой sheduler оптимальнее чем построение своего комбайна на голых thread + fiber

Nick
15.08.2016
10:39:52
попробую сделать планировщик на основе интерфейса Sheduler и примера FiberSheduler... заменил ThreadSheduler им и действительно получилось без проблем масштабировать количество spawn-функций

100т вместо 10т при ThreadSheduler без проблем создано и памяти помешьше ест в два раза, осталось разобрать Fiberы по Threadам

Nick
15.08.2016
10:54:27
нет, но от части и это тоже

Admin
ERROR: S client not available

Nick
15.08.2016
11:14:09
есть несколько проектов, пишу каркас приложения пока, который бы смог работать на всех них... vibe.d это конечно здорово... но это сродни юзать ruby on rails для голого api

один из проектов пиринговый нод, так что там конечно серверная часть однозначно есть

ну и от части данные ноды должны уметь оптимально юзать многопоточность как локально на оборудовании так и колаборативно между собой

Oleg
15.08.2016
14:11:05
Перед кем-нибудь вставала такая проблема: сервер не отдаёт в ответе данные, а присылает ссылку для скачивания xml (только xml), пока приходится скачивать файл с помощью std.net.curl.download (самое простое решение, но, мне кажется, не лучшее). Эти данные нужно записать в mongodb, чуть видоизменив (добавив некоторую информацию, чуть изменив имена полей) Как сделать красиво? Стандартный std.xml, как я понял, не позволяет читать итеративно файл, работает с ним только после прочтения в строку. Чтобы сформировать данные для добавления в базу нужно их сначала в vibe.data.bson перевести. В std.xml есть класс DocumentParser, но он работает со строкой, а не с файлом, итеративно читая + не умеет произвольные имена тэгов.

В итоге получается: 1. получаю ссылку сохраняю файл на диск (нагружаю диск зря) 2. читаю файл целиком (расходую память зря) 3. перевожу пока весь файл (опять расход памяти, но это легко исправить) 4. пишу в базу

если слить 3 и 4 пункты, то поменьше расход памяти будет в 2 раза

смотрел на эту библиотечку, вроде можно скачать файл частями и на диск оно по умолчанию не пишет https://habrahabr.ru/post/304072/

но без итеративного разбора xml это бесполезно

хотя проще руками видимо

Dmitry
16.08.2016
07:28:32
О что я вычитал: " Порядок выполнения деструкторов модуля - снизу вверх (обратный лексиче­ский порядок)."

Pavel
16.08.2016
07:33:47
в го насколько помню в рекламации зазывают свободными от ограничений горутинами которые вроде и не надо менеджерить по процессорам
Насколько я знаю поверхностно о го, там действительно есть фишка, когда горутины незаметно для разработчика могут переноситься по разным ядрам, таким образом выполнение оптимизируется.

Google
Pavel
16.08.2016
07:34:48
Например если 3 ядра проставивают, а на 4 фигачат тяжелые горутины, то некоторые из них могут быть переброшены на первые 3 ядра чтобы была равномерная нагрузка. Есть ли такое в D я не знаю. Но может в vibe.d что-то придумано.

Dmitry
16.08.2016
07:37:56
" Изоляция обеспечивается не аппаратно (как в случае с процессами) и не с помо­щью проверок времени исполнения; она является естественным следст­вием устройства системы типов D."" Я не понял, а как дишная система типов позволят изолировать данные друг от друга?

Павел, на сколько я знаю этого нет и не планируется т.к. перенос файберов по тредам дело сложное и выхлоп очень сомнительный именно поэтому в вайбе от этого отказались

И в продолжение темы про Spawn. Получается spawn это поток который умеет перекидываться с другим потоком сообщениями? Просто я не понял там вроде как про встроенный планировщик написано. Получается это не поток ОС?

Nick
16.08.2016
08:17:13
по поводу изоляции типами данных - как и в функциональных языках разрешается без ограничений шарить данные в режиме только чтения (immutable), такие данные меж сколькими бы участниками они не были разделены не приведут ни к каким казусам

данные которые shared так или иначе используют блокировки и очерёдность в доступе

spawn это надстройка над thread, fiber, которая в купе с sheduler предоставляет некий конкретный механизм разделения потока исполнения

по умолчанию spawn плодит kernel threads

но изменив sheduler (он интерфейс) можно сделать любое другое поведение

Dmitry
18.08.2016
06:26:19
Ржу. С форума: - D оттолкнул тем, что его сделал Александреску, а о нем я невысокого мнения из-за его Zortech C++ - Но Александреску не имел никакого отношения к Zortech C++. - Скорее всего это был Брайт, а Александреску всплыл в памяти из-за того, что он более известный, поэтому и осадочек остался

Так, я что-то подтупливаю. Есть массив JSON: [{foo:"123"},{bar:"321"}] мне чтобы до foo дотянуться что нужно? Цикл писать?

или как-то покрасиве можно

Макс
18.08.2016
08:04:52
там разве нет какого-то asArray(), возвращающего JSONValue[]?

Dmitry
18.08.2016
08:06:06
и в каком виде оно могло бы это возвращать?

в том плане, что можно было обращаться myarra["foo"] ?

Макс
18.08.2016
08:07:08
я не помню названия функций, но уверен, что нужно что-то вроде json.asArray()["foo"].asStr()

Dmitry
18.08.2016
08:26:36
Есть такая функция, но она вроде бы для структур и классов http://vibed.org/api/vibe.data.serialization/asArray

Oleg
18.08.2016
09:21:20
можно проще

json[0]["foo"]

так как исходный json это массив, а потом уже внутрь объекта лезешь

и JSONValue из std.json и Json из vibe.data.json поддерживают этот синтаксис

Страница 52 из 719