Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Многопоточный телнет / 25 сообщений из 43, страница 1 из 2
09.11.2017, 21:11:12
    #39550561
aka777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
набросал минимальный примерчик, для пояснения сути вопроса:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
unit Main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, TrayIcon, Menus, ZAbstractConnection, ZConnection, StdCtrls,
 Buttons, ExtCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
 IdTCPClient, IdTelnet, DB, ZAbstractRODataset, ZAbstractDataset, ZDataset, DateUtils;

type
 TMainForm = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure TimerTimer(Sender: TObject);
 private
   { Private declarations }
   IPList: TStringList;
   ThreadArray: array of TThread;
   PredScanTime: TDateTime;    
 public
   { Public declarations }
 end;

 TTelnetThread = class(TThread)
 private
   IdTelnet: TIdTelnet;
   PortNo: Integer;
   IP: String;
   LastPortText: String;
   procedure ParsePortText;
   procedure DataAvailable(Sender: TIdTelnet; const Buffer: String);
 protected
   procedure Execute; override;
 public
   constructor Create(IP: String);
 end;

var
 MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.FormCreate(Sender: TObject);
var
 i,j: Integer;
begin
 IPList := TStringList.Create;
 IPList.LoadFromFile(ExtractFileDir(Application.ExeName)+'\IP.txt');

 PredScanTime := Now;
 SetLength(ThreadArray, IPList.Count);
end;

constructor TTelnetThread.Create(IP: String);
begin
 inherited Create(True);
 IP := IP;
 LastPortText := '';
end;

procedure TTelnetThread.DataAvailable(Sender: TIdTelnet; const Buffer: String);
begin
 LastPortText := LastPortText + Buffer;
end;

procedure TTelnetThread.ParsePortText;
begin
  1) Парсим текст
  2) Вставляем в базу
end;

{Стартуем потоки каждые 5 минут}
procedure TMainForm.TimerTimer(Sender: TObject);
var
 i: Integer;
begin
 if DateTimeToUnix(Now) > DateTimeToUnix(PredScanTime) + 300 {ScanInterval} then begin
    PredScanTime := Now;

    for i := 0 to Length(ThreadArray) - 1 do begin
      ThreadArray[i] := TTelnetThread.Create(IPList[i],PLList[i]);
      ThreadArray[i].FreeOnTerminate := True;
      ThreadArray[i].Priority := tpLower;
      ThreadArray[i].Resume;
    end;
 end;
end;

procedure TTelnetThread.Execute;
var
 i: Integer;
begin
 try
   IdTelnet := TIdTelnet.Create(nil);
   IdTelnet.OnDataAvailable := DataAvailable;
   IdTelnet.Host := IP;
   IdTelnet.Connect(-1);

   Sleep(2000);
   IdTelnet.Write('admin'+#13#10);
   Sleep(2000);
   IdTelnet.Write('admin'+#13#10);
 except

 end;

 try
   for i := 1 to 64 do begin
     LastPortText := '';
     PortNo := i;
     IdTelnet.Write('get port '+IntToStr(i)+' data'+#13#10);
     sleep(1500);

     Synchronize(ParsePortText);
   end;
 except

 end;

 IdTelnet.Free;
end;

end;

end.


Чем больше потоков, тем больше LastPortText = '', до 30 потоков все 30X(64порта) =1960 записей на месте. Дальше чем больше потоков тем больше пустых LastPortText в квадратичной прогрессии. В чем костыль? Как количесво потоков можем повлиять на то, что idTelnet не успевает вернуть ответ, если он сам же в отдельном потое? так же быть не должно.

Вобщем чем больше потоков тем больше я теряю данных, до 30 потоков не теряю ничего. Может проблема в самом idTelnet ?
...
Рейтинг: 0 / 0
10.11.2017, 07:58:03
    #39550655
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
aka777,

а ничего, что Microsoft настоятельно рекомендует не использовать в программе потоков количеством более, чем число ядер процессоров в системе * 2? У тебя банально операционка не дает квантов времени на выполнение потокам
...
Рейтинг: 0 / 0
10.11.2017, 09:05:19
    #39550667
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
asutp2, народ ждёт чуда и свято верит в "чем больше - тем лучше"
...
Рейтинг: 0 / 0
10.11.2017, 10:39:13
    #39550756
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
asutp2aka777,

а ничего, что Microsoft настоятельно рекомендует не использовать в программе потоков количеством более, чем число ядер процессоров в системе * 2? У тебя банально операционка не дает квантов времени на выполнение потокам

А ничего, что в системе число потоков у системных процессов на порядок превышает число ядер процессора ?

Марксизм не догма, а руководство к действию. (с)
...
Рейтинг: 0 / 0
10.11.2017, 10:48:42
    #39550766
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
schiА ничего, что в системе число потоков у системных процессов на порядок превышает число ядер процессора ?
Порядок? На порядки. :)
...
Рейтинг: 0 / 0
10.11.2017, 10:55:02
    #39550777
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
wadmanschiА ничего, что в системе число потоков у системных процессов на порядок превышает число ядер процессора ?
Порядок? На порядки. :)
На порядки в квадрате :)

И тем не менее проблема у ТС подтверждает, к чему приводит бездумное использование большого количества потоков.
А, и во всем конечно же виноват Билл Гейтс :)
...
Рейтинг: 0 / 0
10.11.2017, 11:09:26
    #39550801
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
asutp2На порядки в квадрате :)
А я не шучу.
У меня колонка с количеством потоков всегда перед глазами в процесс эксплоере.
...
Рейтинг: 0 / 0
10.11.2017, 11:16:37
    #39550813
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
Технические подробности можно почитать здесь
...
Рейтинг: 0 / 0
10.11.2017, 11:20:27
    #39550821
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
wadman,

ОС может позволить себе всё, что посчитает нужным, включая необходимое количество потоков в системных процессах. Однако для обычных приложений могут действовать иные правила, чем для системы. Не знаю, как в других ОС, но в виндах производитель ОС четко говорит, чего позволено черни
...
Рейтинг: 0 / 0
10.11.2017, 11:22:02
    #39550823
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
white_nigger, народ и правда верит в чудо :-)
...
Рейтинг: 0 / 0
10.11.2017, 11:32:23
    #39550832
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
asutp2Не знаю, как в других ОС, но в виндах производитель ОС четко говорит, чего позволено черни
Нет таких четких правил.
Вот в андроиде ОС четко говорит, что операции с сетью должны происходить вне основного потока и бьет по голове за нарушение.
Так что домыслы по поводу ограничения количества потоков это догмы. Особенно если это касается клиент-серверных технологий.
...
Рейтинг: 0 / 0
10.11.2017, 11:34:28
    #39550835
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
wadmanТак что домыслы по поводу ограничения количества потоков это догмы. Особенно если это касается клиент-серверных технологийесли поток по большей части спит в ожидании события а не тупо циклит что-то то они и тысячами вполне себе мирно в одном процессе могут уживаться
...
Рейтинг: 0 / 0
10.11.2017, 11:34:54
    #39550837
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
white_niggerТехнические подробности можно почитать здесь

А еще лучше здесь:
https://blogs.technet.microsoft.com/mark_russinovich/2009/11/02/windows-1080/
...
Рейтинг: 0 / 0
10.11.2017, 11:35:45
    #39550839
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
Меня одного напрягло, что автор реализует диалоговое взаимодействие с сервером через Sleep(), вместо анализа ответов, а после этого тупо давит эксепшены? А потом не понимает почему что-то не работает и где затык?
...
Рейтинг: 0 / 0
10.11.2017, 11:37:35
    #39550844
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
vavanwadmanТак что домыслы по поводу ограничения количества потоков это догмы. Особенно если это касается клиент-серверных технологийесли поток по большей части спит в ожидании события а не тупо циклит что-то то они и тысячами вполне себе мирно в одном процессе могут уживаться
Это уже вопрос к программисту, что его поток делает, когда нужно ждать/спать.
ТС вон синхронизацией балуется и удивляется, что не работает...
...
Рейтинг: 0 / 0
10.11.2017, 11:40:36
    #39550848
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
wadmanЭто уже вопрос к программисту, что его поток делает, когда нужно ждать/спатьну да. я к тому что в принципе никакого криминала наплодить потоков нет. не всегда это конечно будет ассоциировано со здравым смыслом и пойдет на пользу но тем не менее
...
Рейтинг: 0 / 0
10.11.2017, 11:42:46
    #39550850
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
Код: pascal
1.
 IP := IP;



"Красота-то какая..."
...
Рейтинг: 0 / 0
10.11.2017, 11:50:50
    #39550859
Ghost Writer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
aka777
Код: pascal
1.
Sleep(1500);

может слипов не хватает с увеличением кол-ва нитей. не знаток этого копонента, но может ReadLnWait вместо Sleep. хз
...
Рейтинг: 0 / 0
10.11.2017, 12:46:51
    #39550905
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
schiА еще лучше здесь:
https://blogs.technet.microsoft.com/mark_russinovich/2009/11/02/windows-1080/ Ну грубо говоря, в твоём чувак из Microsoft говорит о том когда и сколько всего винда позволяет создать потоков. А в моём чувак из Intel говорит почему избыток потоков накрывает медным тазом быстродействие и даёт рекомендации. Хз что ТС-у полезнее будет :)
...
Рейтинг: 0 / 0
10.11.2017, 13:14:48
    #39550930
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
white_nigger,

Ты сам-то статью по своей ссылке почитай, особенно в части Organizing Threads. Вообще, в статье говорится о том, что частое переключение контекста это плохо (кто-бы сомневался...), а у топикстартера мало того, что в потоках делается IO (а значит поток будет спать на объекте ожидания), так они ещё и тупо спят большую часть своей жизни. Таких потоков можно запустить столько, сколько в адресное пространство влезет. И дело уж точно не в квантовании, т.к. спящие потоки из планирования исключаются. О чём, кстати, в статье по твоей ссылке говорится.
...
Рейтинг: 0 / 0
10.11.2017, 13:31:05
    #39550943
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
Kazantsev Alexey - читал и что? Статья называется "Why Too Many Threads Hurts Performance, and What to do About It" и речь собсно об этом и идет. Где ты нашёл противоречие?
...
Рейтинг: 0 / 0
10.11.2017, 13:48:03
    #39550968
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
Мало прочитать название статьи, нужно ещё и саму статью...
Organizing ThreadsRunnable threads, not blocked threads, cause time-slicing overhead. When a thread blocks on an external event, such as a mouse click or disk I/O request, the operating system takes it off the round-robin schedule, so the thread no longer incurs time-slicing overhead. A program may have many more software threads than hardware threads, and still run efficiently if most of those software threads are blocked.
...
Рейтинг: 0 / 0
10.11.2017, 14:12:49
    #39551002
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
Kazantsev AlexeyМало прочитать название статьи, нужно ещё и саму статью...Пятничное уже началось? Я вообще-то привел статью к своей фразе, что не всегда "чем больше - тем лучше". В упомянутой тобой главе "Organizing Threads", как раз первым делом и рекомендуется ограничить число работающих потоков: "A good solution is to limit the number of runnable threads to the number of hardware threads, and possibly limit it to the number of outer-level caches if cache contention is a problem.". Понятно что никто не мешает наплодить ещё туеву хучу спящих. Вопрос нужно ли?
PS: В работе TIdTelnet не использовал. Так что это безотносительно тонкости его работы
...
Рейтинг: 0 / 0
10.11.2017, 14:33:51
    #39551024
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
white_niggerЯ вообще-то привел статью к своей фразе, что не всегда "чем больше - тем лучше"
Я бы не стал ничего писать, если бы твоя фраза содержала вот это "не всегда".

white_niggerВ упомянутой тобой главе "Organizing Threads", как раз первым делом и рекомендуется ограничить число работающих потоков: "A good solution is to limit the number of runnable threads to the number of hardware threads, and possibly limit it to the number of outer-level caches if cache contention is a problem."
Тут говорится о runnable потоках, а у ТС'а они, практически всегда, blocked (в терминолигии автора статьи). Если читать статью дальше, то можно увидеть, что речь вообще идёт об ограничении вычислительных (compute threads) потоков.

white_niggerПонятно что никто не мешает наплодить ещё туеву хучу спящих. Вопрос нужно ли?
Вопрос, нужно или нет, не стоит. По крайней мере в этом нет ничего криминального и проблемы ТС с этим не связаны.
...
Рейтинг: 0 / 0
10.11.2017, 15:15:15
    #39551059
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточный телнет
Kazantsev Alexeywhite_niggerЯ вообще-то привел статью к своей фразе, что не всегда "чем больше - тем лучше"
Я бы не стал ничего писать, если бы твоя фраза содержала вот это "не всегда".
Моя фраза:
white_niggerнарод ждёт чуда и свято верит в "чем больше - тем лучше"Где тут "всегда" или "не всегда"? А почему "не всегда" и как правильно - говорится в статье.
PS:
Короче не понял я к чему эта полемика поднялась. Весьма сомневаюсь, что нам нужно друг-другу про потоки рассказывать
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Многопоточный телнет / 25 сообщений из 43, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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