Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 7 8 [9] 10   вперед  Ctrl      все
 Re: Lazarus  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5446
DmSer
kealon(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 и копирование кусков стека корутин.
мда...
вас послушать, так шарписты и голубцы под какими то разными ОС запускают свои программы
я вот прям перекрестился, до пенсии мне работы хватит
2 ноя 19, 20:48    [22008813]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
ёёёёё
Member

Откуда:
Сообщений: 1538
DmSer
ёёёёё
пропущено...

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


16КБ - это и было про стек.

"Вопросов больше не имею" - (с).
2 ноя 19, 22:23    [22008853]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 938
ёёёёё
DmSer
пропущено...


16КБ - это и было про стек.

"Вопросов больше не имею" - (с).


А что не так?
2 ноя 19, 22:38    [22008862]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3919
kealon(Ruslan)
голубцы

никогда такого не слышал.
3 ноя 19, 00:47    [22008908]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3919
DmSer
А что не так?

Дефолтный резервируемый размер стека - 1Mb. Поэтому на 32-битах у приложения просто заканчивается адресное пространство.
3 ноя 19, 00:56    [22008909]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
alekcvp
Member

Откуда:
Сообщений: 1688
Kazantsev Alexey
DmSer
А что не так?

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

А как его поменять для потока, кстати?
3 ноя 19, 01:49    [22008918]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
ёёёёё
Member

Откуда:
Сообщений: 1538
alekcvp
Kazantsev Alexey
пропущено...

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

А как его поменять для потока, кстати?

В параметрах линкера. Задается для всех создаваемых нитей приложения.

Для отдельной нити - в CreateThread() есть параметр, можно задать свое значение. Но - не меньше величины гранулярности памяти Windows, т.е. 64кБ.
3 ноя 19, 02:29    [22008922]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 938
Kazantsev Alexey
DmSer
А что не так?

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


Я про адресное пространство не упоминал. Не вижу смысла. Особенно для 64-битных приложений. А вот количество физической памяти считаю более важным показателем.
3 ноя 19, 08:51    [22008941]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1720
DmSer
В другой стороны, потоки в Delphi намного легче, чем потоки в ... JavaScript.


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


забористо
3 ноя 19, 17:43    [22009073]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
ёёёёё
Member

Откуда:
Сообщений: 1538
DmSer
Kazantsev Alexey
пропущено...

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


Я про адресное пространство не упоминал. Не вижу смысла. Особенно для 64-битных приложений. А вот количество физической памяти считаю более важным показателем.

Прэлэстно. Особенно про постоянную оговорку "особенно".
3 ноя 19, 20:46    [22009104]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 938
ёёёёё
Прэлэстно. Особенно про постоянную оговорку "особенно".


Если Вы хотите что-то спросить, то спрашивайте, чего стесняться? Может я чего-то не понимаю, а благодаря Вам узнаю что-то новое.
3 ноя 19, 21:26    [22009122]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
ёёёёё
Member

Откуда:
Сообщений: 1538
DmSer,

нет, меня ваши бормоталки устраивают прямо в этом виде.
3 ноя 19, 22:35    [22009147]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 938
ёёёёё
DmSer,

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


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

Виртуальное адресное пространство для 64-битных приложений упоминать нет смысла, поскольку его дохрена и при создании даже десятков тысяч тредов мы не упрёмся в его дефицит. А для 32-битных приложений, как уже было сказано выше, можно задать в параметрах линкера "max stack size" (например 64КБ) и тем самым резко увеличить максимальное число тредов. Причем следует учитывать, что для 32-битного приложения, запущенного на 64-битной винде, ОС создаёт для каждого треда 64-битный стек размером 256КБ, поэтому кол-во потоков будет меньше, чем для 32-битной винды.
При создании треда выделяется совсем небольшое физической памяти (примерно 8 - 16 КБ на стек), причем оно никак не связано с параметром "max stack size".
4 ноя 19, 00:57    [22009174]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5446
DmSer,

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

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

Сам диспетчер написать, это строчек 500
А вот с библиотеками которые будут его поддерживать уже проблема
Даже минимум вроде работы с примитивами блокировки, файлами и сетью при переписке на overlapped-режим потянет на несколько человеко-месяцев разработки.
Если замахнуться на гуи, то объём вообще становится непосильный
4 ноя 19, 11:51    [22009274]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 938
Но, что бы была возможность увеличить его до max stack size нужно зарезирвировать для этого адреса на весь этот объём - а они очень быстро конечны.


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

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

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


Да и не нужно это переносить на Delphi. Итак всё работает, незачем ломать. Пусть лучше допилят 64-битный Android и управляемые записи.
4 ноя 19, 12:13    [22009287]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5269
Kazantsev Alexey
Даже с дефолтным размером стека на 32-битах можно создать чуть более 1900 потоков.

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}


Кстати, а так на ~2900 потоков хватит?
4 ноя 19, 14:23    [22009359]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3919
Квейд
Кстати, а так на ~2900 потоков хватит?

На 32-битной ОС с ключём /3GB, теоретически, примерно столько. На 64-битной, теоретически, под 4 тыс. на практике (Windows 7 x64) получилось 3120.
4 ноя 19, 15:04    [22009386]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Siemargl
Member [заблокирован]

Откуда: 010100
Сообщений: 6330
Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится.

JavaScript с потоками - что то новое =)
4 ноя 19, 19:23    [22009502]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
rgreat
Member

Откуда:
Сообщений: 5476
Siemargl
Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится.

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

Пул тоже ресурсов стоит и далеко не всегда выгоден, даже если не учитывать усложнение кода.
4 ноя 19, 19:25    [22009505]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 938
Siemargl

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


К сожалению не могу объяснить как это в мой пост проскачило. Набираю вслепую, иногда попадает такое, о чем не задумываешься. Возможно в тот момент были мысли о nodejs. А может о java ;)
4 ноя 19, 19:40    [22009515]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
ёёёёё
Member

Откуда:
Сообщений: 1538
DmSer,

сделайте паузу. Вход-мееедленный выдох.
4 ноя 19, 19:56    [22009521]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1720
DmSer
Siemargl

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


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

java и javascript это ведь одно и то же
5 ноя 19, 05:05    [22009658]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Василий 2
Member

Откуда:
Сообщений: 856
Siemargl
Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится.

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

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

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

Это все сахар, призванный помочь тем, кто не осилил асинхронное мышление, писать асинхронный код в манере синхронного. И async в JS появился не так уж давно, до этого все сидели на коллбэках, а ведь это вывих мозга покруче событий
5 ноя 19, 09:40    [22009738]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 938
Василий 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.
5 ноя 19, 12:53    [22009883]     Ответить | Цитировать Сообщить модератору
 Re: Lazarus  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1720
Василий 2
Siemargl
Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится.

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

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


1. речь не за браузер и ссылку на до было на доку ноды давать
2. воркеры не не новость, но предназначены они для cpu-bound задач, а не для IO
5 ноя 19, 13:24    [22009907]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 7 8 [9] 10   вперед  Ctrl      все
Все форумы / Delphi Ответить