powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus
25 сообщений из 314, страница 9 из 13
Lazarus
    #39884646
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerkealon(Ruslan)как либу + какой-то базовый RTL к ней напишешь так и будет
не вижу никаких причин вводить для этого синтаксический сахар, текущих языковых возможностей с лихвой хватает

В целом мне хватает Indy. С нею стиль программирование такой же удобный, как в C# / JavaScript при использовании async/await. Разница только в том, что в Indy на каждое подключение выделяется отдельный поток, а при async/await потоки выделяются при необходимости, один поток может обслуживать десятки подключений.
В другой стороны, потоки в Delphi намного легче, чем потоки в C# / JavaScript. В Delphi при создании потока выделяется порядка 16КБ ОЗУ (+ ещё 16КБ, если Windows 64-битный, а прога 32-битная). Таким образом, установить несколько тысяч потоков (если и прога и ОС - 64-битные) - не проблема. Важно с таким количеством потоков избегать использование Sleep (особенно Sleep(0)), иначе планировщик задач Windows загнётся.
Не знаю, сколько подключений можно установить на C# с его async/await. Скорее всего больше, чем в Indy (а может и меньше, тупо может начать тормозить основной поток, из которого на практике вероятнее всего начинаются await-вызовы из-за того, что будет быстро заполняться очередь сообщений у потока).
В этом плане лучше всего GoLang - у него нет потока, у которого может заполнится очередь сообщений и он начнёт тормозить при её обработке, поэтому без проблем может держать десятки тысяч подключений, причем ему для этого хватит лишь несколько десятков потоков Worker. Правда, у него есть поток диспетчеризации, который раскидывает задачи (горутины) между тредами и копирует куски стека, в него всё может упереться. Вроде такую же вещь сделали и в котлине - скрестили оба подхода - там и аналог async/await и копирование кусков стека корутин.мда...
вас послушать, так шарписты и голубцы под какими то разными ОС запускают свои программы
я вот прям перекрестился, до пенсии мне работы хватит
...
Рейтинг: 0 / 0
Lazarus
    #39884670
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerёёёёёпропущено...

А стек на каждую нить почему не учел?

16КБ - это и было про стек.
"Вопросов больше не имею" - (с).
...
Рейтинг: 0 / 0
Lazarus
    #39884678
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёDmSerпропущено...


16КБ - это и было про стек.
"Вопросов больше не имею" - (с).

А что не так?
...
Рейтинг: 0 / 0
Lazarus
    #39884698
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)голубцы
никогда такого не слышал.
...
Рейтинг: 0 / 0
Lazarus
    #39884699
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerА что не так?
Дефолтный резервируемый размер стека - 1Mb. Поэтому на 32-битах у приложения просто заканчивается адресное пространство.
...
Рейтинг: 0 / 0
Lazarus
    #39884702
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyDmSerА что не так?
Дефолтный резервируемый размер стека - 1Mb. Поэтому на 32-битах у приложения просто заканчивается адресное пространство.
А как его поменять для потока, кстати?
...
Рейтинг: 0 / 0
Lazarus
    #39884704
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpKazantsev Alexeyпропущено...

Дефолтный резервируемый размер стека - 1Mb. Поэтому на 32-битах у приложения просто заканчивается адресное пространство.
А как его поменять для потока, кстати?
В параметрах линкера. Задается для всех создаваемых нитей приложения.

Для отдельной нити - в CreateThread() есть параметр, можно задать свое значение. Но - не меньше величины гранулярности памяти Windows, т.е. 64кБ.
...
Рейтинг: 0 / 0
Lazarus
    #39884714
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyDmSerА что не так?
Дефолтный резервируемый размер стека - 1Mb. Поэтому на 32-битах у приложения просто заканчивается адресное пространство.

Я про адресное пространство не упоминал. Не вижу смысла. Особенно для 64-битных приложений. А вот количество физической памяти считаю более важным показателем.
...
Рейтинг: 0 / 0
Lazarus
    #39884790
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerВ другой стороны, потоки в Delphi намного легче, чем потоки в ... JavaScript.

DmSerВ этом плане лучше всего GoLang - у него нет потока, у которого может заполнится очередь сообщений и он начнёт тормозить при её обработке, поэтому без проблем может держать десятки тысяч подключений, причем ему для этого хватит лишь несколько десятков потоков Worker. Правда, у него есть поток диспетчеризации, который раскидывает задачи (горутины) между тредами и копирует куски стека, в него всё может упереться.

забористо
...
Рейтинг: 0 / 0
Lazarus
    #39884805
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerKazantsev Alexeyпропущено...

Дефолтный резервируемый размер стека - 1Mb. Поэтому на 32-битах у приложения просто заканчивается адресное пространство.

Я про адресное пространство не упоминал. Не вижу смысла. Особенно для 64-битных приложений. А вот количество физической памяти считаю более важным показателем.
Прэлэстно. Особенно про постоянную оговорку "особенно".
...
Рейтинг: 0 / 0
Lazarus
    #39884815
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёПрэлэстно. Особенно про постоянную оговорку "особенно".

Если Вы хотите что-то спросить, то спрашивайте, чего стесняться? Может я чего-то не понимаю, а благодаря Вам узнаю что-то новое.
...
Рейтинг: 0 / 0
Lazarus
    #39884826
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

нет, меня ваши бормоталки устраивают прямо в этом виде.
...
Рейтинг: 0 / 0
Lazarus
    #39884843
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёDmSer,

нет, меня ваши бормоталки устраивают прямо в этом виде.

Слово "особенно" мною было сказано только в двух сообщениях: применительно к Sleep(0) и к 64-битным приложениям.

Виртуальное адресное пространство для 64-битных приложений упоминать нет смысла, поскольку его дохрена и при создании даже десятков тысяч тредов мы не упрёмся в его дефицит. А для 32-битных приложений, как уже было сказано выше, можно задать в параметрах линкера "max stack size" (например 64КБ) и тем самым резко увеличить максимальное число тредов. Причем следует учитывать, что для 32-битного приложения, запущенного на 64-битной винде, ОС создаёт для каждого треда 64-битный стек размером 256КБ, поэтому кол-во потоков будет меньше, чем для 32-битной винды.
При создании треда выделяется совсем небольшое физической памяти (примерно 8 - 16 КБ на стек), причем оно никак не связано с параметром "max stack size".
...
Рейтинг: 0 / 0
Lazarus
    #39884900
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

Физическая память без нужды, да, не выделяется, на старте потока 1 страница всего
Но, что бы была возможность увеличить его до max stack size нужно зарезирвировать для этого адреса на весь этот объём - а они очень быстро конечны.

По поводу, повторить то, что сделано в .Net - совсем не Rocket Science.
Если упрощённо, то там просто пул потоков разгребает нити с задачами из IOPort

Сам диспетчер написать, это строчек 500
А вот с библиотеками которые будут его поддерживать уже проблема
Даже минимум вроде работы с примитивами блокировки, файлами и сетью при переписке на overlapped-режим потянет на несколько человеко-месяцев разработки.
Если замахнуться на гуи, то объём вообще становится непосильный
...
Рейтинг: 0 / 0
Lazarus
    #39884910
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но, что бы была возможность увеличить его до max stack size нужно зарезирвировать для этого адреса на весь этот объём - а они очень быстро конечны.


Логично! Однако в реальных задачах крайне редко возникает необходимость достигать max stack size, который по умолчанию в Windows равен 1МБ. В своих программах не встречал случаев, чтобы и за 64 КБ вылезло.

По поводу, повторить то, что сделано в .Net - совсем не Rocket Science.
Если упрощённо, то там просто пул потоков разгребает нити с задачами из IOPort

Сам диспетчер написать, это строчек 500
А вот с библиотеками которые будут его поддерживать уже проблема
Даже минимум вроде работы с примитивами блокировки, файлами и сетью при переписке на overlapped-режим потянет на несколько человеко-месяцев разработки.
Если замахнуться на гуи, то объём вообще становится непосильный


Да и не нужно это переносить на Delphi. Итак всё работает, незачем ломать. Пусть лучше допилят 64-битный Android и управляемые записи.
...
Рейтинг: 0 / 0
Lazarus
    #39884955
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyДаже с дефолтным размером стека на 32-битах можно создать чуть более 1900 потоков.
Код: pascal
1.
{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}



Кстати, а так на ~2900 потоков хватит?
...
Рейтинг: 0 / 0
Lazarus
    #39884970
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдКстати, а так на ~2900 потоков хватит?
На 32-битной ОС с ключём /3GB, теоретически, примерно столько. На 64-битной, теоретически, под 4 тыс. на практике (Windows 7 x64) получилось 3120.
...
Рейтинг: 0 / 0
Lazarus
    #39885046
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится.

JavaScript с потоками - что то новое =)
...
Рейтинг: 0 / 0
Lazarus
    #39885047
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl
Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится.

Ничего подобного.

Пул тоже ресурсов стоит и далеко не всегда выгоден, даже если не учитывать усложнение кода.
...
Рейтинг: 0 / 0
Lazarus
    #39885054
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl

JavaScript с потоками - что то новое =)


К сожалению не могу объяснить как это в мой пост проскачило. Набираю вслепую, иногда попадает такое, о чем не задумываешься. Возможно в тот момент были мысли о nodejs. А может о java ;)
...
Рейтинг: 0 / 0
Lazarus
    #39885056
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

сделайте паузу. Вход-мееедленный выдох.
...
Рейтинг: 0 / 0
Lazarus
    #39885127
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Siemargl

JavaScript с потоками - что то новое =)


К сожалению не могу объяснить как это в мой пост проскачило. Набираю вслепую, иногда попадает такое, о чем не задумываешься. Возможно в тот момент были мысли о nodejs. А может о java ;)

java и javascript это ведь одно и то же
...
Рейтинг: 0 / 0
Lazarus
    #39885157
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl
Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится.

JavaScript с потоками - что то новое =)

https://developer.mozilla.org/en-US/docs/Web/API/Worker вообще не новое

DmSer
Асинхронное программирование на Паскале это не тоже самое, что на c#, JavaScript и других языках с поддержкой async / await. Пусть уж лучше будут блокировки.

Это все сахар, призванный помочь тем, кто не осилил асинхронное мышление, писать асинхронный код в манере синхронного. И async в JS появился не так уж давно, до этого все сидели на коллбэках, а ведь это вывих мозга покруче событий
...
Рейтинг: 0 / 0
Lazarus
    #39885237
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2
Siemargl
Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится.

JavaScript с потоками - что то новое =)

https://developer.mozilla.org/en-US/docs/Web/API/Worker вообще не новое

DmSer
Асинхронное программирование на Паскале это не тоже самое, что на c#, JavaScript и других языках с поддержкой async / await. Пусть уж лучше будут блокировки.

Это все сахар, призванный помочь тем, кто не осилил асинхронное мышление, писать асинхронный код в манере синхронного. И async в JS появился не так уж давно, до этого все сидели на коллбэках, а ведь это вывих мозга покруче событий


В JavaScript async / await - это синтактический сахар (вроде сахар, поскольку с точки зрения компиляции наверное ничего не меняется) по отношению к промайзам. Промайзы в JavaScript - был очень важный шаг к решению проблемы коллбэков, а механихм async / await кардинально упростил асинхронное программирование.

А вот является ли async / await синтактическим сахаром по отношению к C# - не уверен. Разработчики механизма async / await в C# ввели новый подход к компиляции, при котором одна функция каждым упоминанием await расщепляется на подфункции, сохраняется состояние переменных на момент вызова await.
...
Рейтинг: 0 / 0
Lazarus
    #39885247
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2
Siemargl
Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится.

JavaScript с потоками - что то новое =)

https://developer.mozilla.org/en-US/docs/Web/API/Worker вообще не новое


1. речь не за браузер и ссылку на до было на доку ноды давать
2. воркеры не не новость, но предназначены они для cpu-bound задач, а не для IO
...
Рейтинг: 0 / 0
25 сообщений из 314, страница 9 из 13
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]