|
|
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
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 и копирование кусков стека корутин.мда... вас послушать, так шарписты и голубцы под какими то разными ОС запускают свои программы я вот прям перекрестился, до пенсии мне работы хватит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2019, 20:48 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
DmSerёёёёёпропущено... А стек на каждую нить почему не учел? 16КБ - это и было про стек. "Вопросов больше не имею" - (с). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2019, 22:23 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
ёёёёёDmSerпропущено... 16КБ - это и было про стек. "Вопросов больше не имею" - (с). А что не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2019, 22:38 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)голубцы никогда такого не слышал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2019, 00:47 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
DmSerА что не так? Дефолтный резервируемый размер стека - 1Mb. Поэтому на 32-битах у приложения просто заканчивается адресное пространство. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2019, 00:56 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyDmSerА что не так? Дефолтный резервируемый размер стека - 1Mb. Поэтому на 32-битах у приложения просто заканчивается адресное пространство. А как его поменять для потока, кстати? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2019, 01:49 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
alekcvpKazantsev Alexeyпропущено... Дефолтный резервируемый размер стека - 1Mb. Поэтому на 32-битах у приложения просто заканчивается адресное пространство. А как его поменять для потока, кстати? В параметрах линкера. Задается для всех создаваемых нитей приложения. Для отдельной нити - в CreateThread() есть параметр, можно задать свое значение. Но - не меньше величины гранулярности памяти Windows, т.е. 64кБ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2019, 02:29 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyDmSerА что не так? Дефолтный резервируемый размер стека - 1Mb. Поэтому на 32-битах у приложения просто заканчивается адресное пространство. Я про адресное пространство не упоминал. Не вижу смысла. Особенно для 64-битных приложений. А вот количество физической памяти считаю более важным показателем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2019, 08:51 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
DmSerВ другой стороны, потоки в Delphi намного легче, чем потоки в ... JavaScript. DmSerВ этом плане лучше всего GoLang - у него нет потока, у которого может заполнится очередь сообщений и он начнёт тормозить при её обработке, поэтому без проблем может держать десятки тысяч подключений, причем ему для этого хватит лишь несколько десятков потоков Worker. Правда, у него есть поток диспетчеризации, который раскидывает задачи (горутины) между тредами и копирует куски стека, в него всё может упереться. забористо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2019, 17:43 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
DmSerKazantsev Alexeyпропущено... Дефолтный резервируемый размер стека - 1Mb. Поэтому на 32-битах у приложения просто заканчивается адресное пространство. Я про адресное пространство не упоминал. Не вижу смысла. Особенно для 64-битных приложений. А вот количество физической памяти считаю более важным показателем. Прэлэстно. Особенно про постоянную оговорку "особенно". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2019, 20:46 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
ёёёёёПрэлэстно. Особенно про постоянную оговорку "особенно". Если Вы хотите что-то спросить, то спрашивайте, чего стесняться? Может я чего-то не понимаю, а благодаря Вам узнаю что-то новое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2019, 21:26 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
DmSer, нет, меня ваши бормоталки устраивают прямо в этом виде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2019, 22:35 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
ёёёёёDmSer, нет, меня ваши бормоталки устраивают прямо в этом виде. Слово "особенно" мною было сказано только в двух сообщениях: применительно к Sleep(0) и к 64-битным приложениям. Виртуальное адресное пространство для 64-битных приложений упоминать нет смысла, поскольку его дохрена и при создании даже десятков тысяч тредов мы не упрёмся в его дефицит. А для 32-битных приложений, как уже было сказано выше, можно задать в параметрах линкера "max stack size" (например 64КБ) и тем самым резко увеличить максимальное число тредов. Причем следует учитывать, что для 32-битного приложения, запущенного на 64-битной винде, ОС создаёт для каждого треда 64-битный стек размером 256КБ, поэтому кол-во потоков будет меньше, чем для 32-битной винды. При создании треда выделяется совсем небольшое физической памяти (примерно 8 - 16 КБ на стек), причем оно никак не связано с параметром "max stack size". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2019, 00:57 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
DmSer, Физическая память без нужды, да, не выделяется, на старте потока 1 страница всего Но, что бы была возможность увеличить его до max stack size нужно зарезирвировать для этого адреса на весь этот объём - а они очень быстро конечны. По поводу, повторить то, что сделано в .Net - совсем не Rocket Science. Если упрощённо, то там просто пул потоков разгребает нити с задачами из IOPort Сам диспетчер написать, это строчек 500 А вот с библиотеками которые будут его поддерживать уже проблема Даже минимум вроде работы с примитивами блокировки, файлами и сетью при переписке на overlapped-режим потянет на несколько человеко-месяцев разработки. Если замахнуться на гуи, то объём вообще становится непосильный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2019, 11:51 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
Но, что бы была возможность увеличить его до max stack size нужно зарезирвировать для этого адреса на весь этот объём - а они очень быстро конечны. Логично! Однако в реальных задачах крайне редко возникает необходимость достигать max stack size, который по умолчанию в Windows равен 1МБ. В своих программах не встречал случаев, чтобы и за 64 КБ вылезло. По поводу, повторить то, что сделано в .Net - совсем не Rocket Science. Если упрощённо, то там просто пул потоков разгребает нити с задачами из IOPort Сам диспетчер написать, это строчек 500 А вот с библиотеками которые будут его поддерживать уже проблема Даже минимум вроде работы с примитивами блокировки, файлами и сетью при переписке на overlapped-режим потянет на несколько человеко-месяцев разработки. Если замахнуться на гуи, то объём вообще становится непосильный Да и не нужно это переносить на Delphi. Итак всё работает, незачем ломать. Пусть лучше допилят 64-битный Android и управляемые записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2019, 12:13 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyДаже с дефолтным размером стека на 32-битах можно создать чуть более 1900 потоков. Код: pascal 1. Кстати, а так на ~2900 потоков хватит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2019, 14:23 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
КвейдКстати, а так на ~2900 потоков хватит? На 32-битной ОС с ключём /3GB, теоретически, примерно столько. На 64-битной, теоретически, под 4 тыс. на практике (Windows 7 x64) получилось 3120. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2019, 15:04 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится. JavaScript с потоками - что то новое =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2019, 19:23 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
Siemargl Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится. Ничего подобного. Пул тоже ресурсов стоит и далеко не всегда выгоден, даже если не учитывать усложнение кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2019, 19:25 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
Siemargl JavaScript с потоками - что то новое =) К сожалению не могу объяснить как это в мой пост проскачило. Набираю вслепую, иногда попадает такое, о чем не задумываешься. Возможно в тот момент были мысли о nodejs. А может о java ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2019, 19:40 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
DmSer, сделайте паузу. Вход-мееедленный выдох. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2019, 19:56 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
DmSer Siemargl JavaScript с потоками - что то новое =) К сожалению не могу объяснить как это в мой пост проскачило. Набираю вслепую, иногда попадает такое, о чем не задумываешься. Возможно в тот момент были мысли о nodejs. А может о java ;) java и javascript это ведь одно и то же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2019, 05:05 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
Siemargl Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится. JavaScript с потоками - что то новое =) https://developer.mozilla.org/en-US/docs/Web/API/Worker вообще не новое DmSer Асинхронное программирование на Паскале это не тоже самое, что на c#, JavaScript и других языках с поддержкой async / await. Пусть уж лучше будут блокировки. Это все сахар, призванный помочь тем, кто не осилил асинхронное мышление, писать асинхронный код в манере синхронного. И async в JS появился не так уж давно, до этого все сидели на коллбэках, а ведь это вывих мозга покруче событий ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2019, 09:40 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
Василий 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2019, 12:53 |
|
||
|
Lazarus
|
|||
|---|---|---|---|
|
#18+
Василий 2 Siemargl Потоков в идеале должно быть число ядер+1 или +2. Остальное должно пулится. JavaScript с потоками - что то новое =) https://developer.mozilla.org/en-US/docs/Web/API/Worker вообще не новое 1. речь не за браузер и ссылку на до было на доку ноды давать 2. воркеры не не новость, но предназначены они для cpu-bound задач, а не для IO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2019, 13:24 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39885157&tid=2037658]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
175ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
95ms |
get tp. blocked users: |
2ms |
| others: | 238ms |
| total: | 556ms |

| 0 / 0 |
