powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Многопоточность
25 сообщений из 26, страница 1 из 2
Многопоточность
    #39805457
Moneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скажите это правильное ли использование многопоточности для реализации одного сценария с разными параметрами в многопотоке. Я получаю код страницы в потоке в зависимости от параметров, но судя по скорости как щас это происходит работает один поток.
=запуск потоков
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
for l:=1 to 10 do
begin

if not fileexists(ExtractFilePath(Application.ExeName)+'out\'+inttostr(YY)+'-'+month+'-'+day+'_ur.txt') then
begin

//создание потока
MyThread := TMyThread.Create(True,'9500','0',inttostr(i),'{"field":"dateCreatedFrom","value":"'+inttostr(YY)+'-'+month+'-'+day+'"},{"field":"dateCreatedTo","value":"'+inttostr(YY)+'-'+month+'-'+day+'"}',inttostr(YY)+'-'+month+'-'+day); 

if Assigned(MyThread.FatalException) then
  raise MyThread.FatalException;

//запуск потока
MyThread.Start;
sleep(300);
end;

end;  




=Поток
Код: 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.
procedure TMyThread.Execute;
var
i:integer;
temp:string;
HTTPs: THTTPSend;
Data: TStringStream;
uuid,tempout: string;
exportfull: tstringlist ;
starttime,endtime:ttime;
trycount:integer;
begin
starttime:=now;
exportfull:= tstringlist.create;
exportfull.text:='';

https:=thttpsend.Create;
HTTPs.UserAgent := 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4';
//https.KeepAlive:=true;
HTTPs.Protocol:= '1.1';
HTTPs.Timeout:= 10000; // 45 seconds
HTTPs.MimeType :='application/json;charset=UTF-8';
HTTPs.Headers.Addstrings(['pwt:1937f8f982e64da2b9e0c6d5fbe889da']);

Data := TStringStream.Create('');
Data.WriteString('{"lang":"rus","apiName":"contragent","apiPath":"/contragentEk5/getFilterData","limit":'+limit+',"offset":'+offset+',"fields":['+fields+',{"field":"type","value":"ur"}],"columns":["ek4Id","country","city","name","type","subdivisionName","kindOfActivity","masterCity","note"],"sort":[]}');

HTTPs.Document.LoadFromStream(Data);
Data.Free;

    temp:='empty';
   trycount:=0;

    while (temp='empty')or(pos('alert',temp)<>0)or(trycount>10) do
    begin
    if not HTTPs.HTTPMethod('POST','https://contragent.cdek.ru/api/preback')  then
    begin
    inc(trycount);

    sleep(50{*trycount});
     end  else
    temp:= PChar(HTTPs.Document.Memory);

    end;

HTTPs.free;

if (temp<>'')and(temp<>'empty') then
begin
exportfull.text:=temp;
exportfull.SaveToFile(ExtractFilePath(Application.ExeName)+'out\'+exportname+'_ur.txt');
end;
exportfull.free;
endtime:=now;

terminate;
end;  



...
Рейтинг: 0 / 0
Многопоточность
    #39805500
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneo,

вот любитель свежих топегов :) Этот 21866436 не нашел?
...
Рейтинг: 0 / 0
Многопоточность
    #39805730
Moneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Док,

сделал так, потоки работают.

Другая проблема: содержимое страницы получается не полностью в файл, если выставить задержку между потоками в 2 секунды, то получаются полностью, но тогда получается что работает как один поток, тогда какой смысл в этих потоках. Что можно предпринять? Я немного в шоке.
...
Рейтинг: 0 / 0
Многопоточность
    #39805752
shonli95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Moneo,

надо сделать синхронизацию и просмотреть готовность всех потоков, что бы выставить пул на сохранения файлов. У тебя может и 3 поток выполнится быстрее первого. И тогда будет белиберда.
...
Рейтинг: 0 / 0
Многопоточность
    #39805762
Moneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
shonli95,

сейчас у меня в потоке получение кода страницы и сохранение в файл. Также сейчас я через каждые 4 потока делаю паузу, если я ставлю паузу в 2 секунды, то все отрабатывается нормально, но это не на много быстрее чем 4 таких же последовательных операции без потока. Что-то у меня не так вообщем с загрузкой кода страниц в файл. Мне кажется происходит что-то с HTTPs.Document.Memory из-за вызова следующей партии потоков.
...
Рейтинг: 0 / 0
Многопоточность
    #39805784
shonli95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ахаха) Это ты ещё не напоролся на быстро - медленный интернет. Пауз на секунды никаких не должно быть.

Я тебе пишу, надо делать синхронизацию, что бы построить конечный пул по сохранению файла в один
...
Рейтинг: 0 / 0
Многопоточность
    #39805790
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MoneoДок,

сделал так, потоки работают.

Другая проблема: содержимое страницы получается не полностью в файл, если выставить задержку между потоками в 2 секунды, то получаются полностью, но тогда получается что работает как один поток, тогда какой смысл в этих потоках. Что можно предпринять? Я немного в шоке.

Потоки пишут в один файл? Если да, то подумайте, что будет, если все они будут одновременно писать в один и тот же файл. Задержкой в 2 секунды вы просто развели по времени доступ в этот файл.
...
Рейтинг: 0 / 0
Многопоточность
    #39805837
Moneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goldmi45,

каждый поток пишет в свой файл, я понимал что нельзя делать запись в один файл либо синхронизировать перед этим этот процесс из-за доступа к файла, да и смысла в этом нет - если бы я так сделал, то файл весил бы сотню гигабайт - txt на такое не способен вроде. Каждый поток пишет файл по дате. Потом я объединю все это в базу, но пока мне нужно разобраться почему при вызове потоков без задержки многие из них не успевают или получить код странице или присвоить этот код строковой переменной. Код простой, а работает через одно место. Прошу помощи.
...
Рейтинг: 0 / 0
Многопоточность
    #39805839
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneo
Код: pascal
1.
2.
3.
4.
5.
    temp:= PChar(HTTPs.Document.Memory);

    end;

HTTPs.free;


Забавный участок кода... А далее идёт работа с temp.
...
Рейтинг: 0 / 0
Многопоточность
    #39805864
Moneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman, почему вам это не нравиться?
...
Рейтинг: 0 / 0
Многопоточность
    #39805865
Moneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я конечно могу включить сохранение temp до этого end, но проблему это не решит.
...
Рейтинг: 0 / 0
Многопоточность
    #39805867
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneowadman, почему вам это не нравиться?
Тем, что память сначала освобождается, а затем идёт работа с ней.
...
Рейтинг: 0 / 0
Многопоточность
    #39805903
Moneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman, я присвоил переменной содержимое страницы и дальше работаю только с переменной - где я ее освобождаю?
...
Рейтинг: 0 / 0
Многопоточность
    #39805904
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HTTPs.free;
...
Рейтинг: 0 / 0
Многопоточность
    #39805981
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneoя присвоил переменной содержимое страницы и дальше работаю только с переменной - где я ее освобождаю?
Переменная это лишь ссылка на участок памяти, который сначала освобождается (и скорее всего используется другим потоком или чем угодно), а затем идет к нему обращение.
Нужно либо сначала с ним работать и освобождать, либо копировать его в новую выделенную область памяти и затем работать (и затем освобождать).
...
Рейтинг: 0 / 0
Многопоточность
    #39806214
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneo,

freeandnil сделай вместо free и сразу увидишь проблемы если они есть. не нужно зомби-ссылки хранить.
...
Рейтинг: 0 / 0
Многопоточность
    #39806255
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonfreeandnil сделай вместо free
FreeAndNil делает то же самое, что и Free плюс обнуляет ссылку на объект, поля самого объекта не затрагиваются, если это не сделано специально в его методе destroy.
...
Рейтинг: 0 / 0
Многопоточность
    #39806388
shonli95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
  temp := StrNew(PChar(HTTPs.Document.Memory));
...
Рейтинг: 0 / 0
Многопоточность
    #39807184
Moneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я разобрался с прошлой проблемой, но сервер очень медленно обрабатывает запросы (максимум 2.5 в секунду, потом выдает ошибки в теле). Может есть готовый инструментарий который может отправлять множество запросов с изменением лишь одного параметра используя прокси сервера или мне самому писать сбор прокси серверов и потом уже с их помощью отправлять эти запросы? Мне нужно отправить 7млн запросов с изменением одного параметра, отправить несколько значений в одном запросе не представляется возможным с стороны сервера.
...
Рейтинг: 0 / 0
Многопоточность
    #39807187
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneo,

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

я слабо себе представляю как можно решить проблему медленного сервера на клиенте. делать сотни параллельных запросов? ну если сервер так разрешит, то можно пробовать.
Скоре всего, сервер ограничивает скорость запросов с одного IP, прокси могут помочь.

Moneo: Поищите сборщики проксей - за малую деньгу просто получите готовый список в json/xml
...
Рейтинг: 0 / 0
Многопоточность
    #39810717
Moneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прикупил 10 прокси, но все равно сервер на половину запросов шлет ошибку :
{"alerts":[{"type":"danger","msg":"Can't find API for apiName = undefined","errorCode":"Can't find API for apiName = undefined"}]}

Параметр apiName передается в запросе, это навело меня на мысль что это не сервер тупит, а я и у меня что-то не так с запросом, вот сам запрос (естественно запросы отсылаются в многопотоках):

Код: 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.
var
HTTPs: THTTPSend;
Data: TStringStream;
temp:string;
begin

 https:=thttpsend.Create;
 HTTPs.UserAgent := 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4';
 HTTPs.Protocol:= '1.1';
 HTTPs.Timeout:= 10000; // 45 seconds
 HTTPs.MimeType :='application/json';
 HTTPs.Headers.Addstrings(['pwt:8fgdfgdfgtert4356839']);

 Data := TStringStream.Create('');
 Data.WriteString('{"lang":"rus","apiName":"contragent","apiPath":"/contragentEk5/getDynamics","filter":{"code":"'+code+'"}}');
 HTTPs.Document.LoadFromStream(Data);

  temp:='';

while temp='' do
begin
 if HTTPs.HTTPMethod('POST','https://contragent.ltek.ru/api/preback')  then
 begin
 temp:= strnew(PChar(HTTPs.Document.Memory));

 HTTPs.document.SaveToFile(ExtractFilePath(Application.ExeName)+'dynamic\'+code+'.txt');
 end else
begin
 sleep(700);
 temp:='';
 end;
end;
 Data.free;
 HTTPs.free;
end;
...
Рейтинг: 0 / 0
Многопоточность
    #39810896
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moneo,

Я не помню как работает httpsend, но тут точно не надо
Код: pascal
1.
2.
3.
4.
Data := TStringStream.Create('');
 Data.WriteString('{"lang":"rus","apiName":"contragent","apiPath":"/contragentEk5/getDynamics","filter":{"code":"'+code+'"}}');
 Data.Position := 0; // ? 
 HTTPs.Document.LoadFromStream(Data);
...
Рейтинг: 0 / 0
Многопоточность
    #39810925
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

не нужно знать как работает httpsend, достаточно знать как работает TStream. там точно надо
...
Рейтинг: 0 / 0
Многопоточность
    #39811218
Moneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
все еще тоже самое
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Многопоточность
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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