Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Многопоточность  [new]
Moneo
Member

Откуда:
Сообщений: 59
Скажите это правильное ли использование многопоточности для реализации одного сценария с разными параметрами в многопотоке. Я получаю код страницы в потоке в зависимости от параметров, но судя по скорости как щас это происходит работает один поток.
+=запуск потоков

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;  



+=Поток

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;  


23 апр 19, 16:25    [21869943]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
Док
Member

Откуда: Казань
Сообщений: 6460
Moneo,

вот любитель свежих топегов :) Этот 21866436 не нашел?
23 апр 19, 17:38    [21870017]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
Moneo
Member

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

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

Другая проблема: содержимое страницы получается не полностью в файл, если выставить задержку между потоками в 2 секунды, то получаются полностью, но тогда получается что работает как один поток, тогда какой смысл в этих потоках. Что можно предпринять? Я немного в шоке.
24 апр 19, 13:31    [21870502]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
shonli95
Member

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

надо сделать синхронизацию и просмотреть готовность всех потоков, что бы выставить пул на сохранения файлов. У тебя может и 3 поток выполнится быстрее первого. И тогда будет белиберда.
24 апр 19, 14:05    [21870545]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
Moneo
Member

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

сейчас у меня в потоке получение кода страницы и сохранение в файл. Также сейчас я через каждые 4 потока делаю паузу, если я ставлю паузу в 2 секунды, то все отрабатывается нормально, но это не на много быстрее чем 4 таких же последовательных операции без потока. Что-то у меня не так вообщем с загрузкой кода страниц в файл. Мне кажется происходит что-то с HTTPs.Document.Memory из-за вызова следующей партии потоков.
24 апр 19, 14:23    [21870575]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
shonli95
Member

Откуда:
Сообщений: 85
Ахаха) Это ты ещё не напоролся на быстро - медленный интернет. Пауз на секунды никаких не должно быть.

Я тебе пишу, надо делать синхронизацию, что бы построить конечный пул по сохранению файла в один
24 апр 19, 15:01    [21870627]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
goldmi45
Member

Откуда:
Сообщений: 1193
Moneo
Док,

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

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


Потоки пишут в один файл? Если да, то подумайте, что будет, если все они будут одновременно писать в один и тот же файл. Задержкой в 2 секунды вы просто развели по времени доступ в этот файл.
24 апр 19, 15:09    [21870642]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
Moneo
Member

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

каждый поток пишет в свой файл, я понимал что нельзя делать запись в один файл либо синхронизировать перед этим этот процесс из-за доступа к файла, да и смысла в этом нет - если бы я так сделал, то файл весил бы сотню гигабайт - txt на такое не способен вроде. Каждый поток пишет файл по дате. Потом я объединю все это в базу, но пока мне нужно разобраться почему при вызове потоков без задержки многие из них не успевают или получить код странице или присвоить этот код строковой переменной. Код простой, а работает через одно место. Прошу помощи.
24 апр 19, 16:10    [21870740]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26132
Moneo
    temp:= PChar(HTTPs.Document.Memory);

    end;

HTTPs.free;

Забавный участок кода... А далее идёт работа с temp.
24 апр 19, 16:12    [21870742]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
Moneo
Member

Откуда:
Сообщений: 59
wadman, почему вам это не нравиться?
24 апр 19, 16:53    [21870787]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
Moneo
Member

Откуда:
Сообщений: 59
Я конечно могу включить сохранение temp до этого end, но проблему это не решит.
24 апр 19, 16:56    [21870790]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26132
Moneo
wadman, почему вам это не нравиться?

Тем, что память сначала освобождается, а затем идёт работа с ней.
24 апр 19, 17:00    [21870800]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
Moneo
Member

Откуда:
Сообщений: 59
wadman, я присвоил переменной содержимое страницы и дальше работаю только с переменной - где я ее освобождаю?
24 апр 19, 19:41    [21870893]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
rgreat
Member

Откуда:
Сообщений: 5448
HTTPs.free;
24 апр 19, 19:50    [21870897]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26132
Moneo
я присвоил переменной содержимое страницы и дальше работаю только с переменной - где я ее освобождаю?

Переменная это лишь ссылка на участок памяти, который сначала освобождается (и скорее всего используется другим потоком или чем угодно), а затем идет к нему обращение.
Нужно либо сначала с ним работать и освобождать, либо копировать его в новую выделенную область памяти и затем работать (и затем освобождать).
25 апр 19, 07:57    [21871161]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3396
Moneo,

freeandnil сделай вместо free и сразу увидишь проблемы если они есть. не нужно зомби-ссылки хранить.
25 апр 19, 13:07    [21871568]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26132
makhaon
freeandnil сделай вместо free

FreeAndNil делает то же самое, что и Free плюс обнуляет ссылку на объект, поля самого объекта не затрагиваются, если это не сделано специально в его методе destroy.
25 апр 19, 13:44    [21871628]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
shonli95
Member

Откуда:
Сообщений: 85
  temp := StrNew(PChar(HTTPs.Document.Memory));
25 апр 19, 16:33    [21871859]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
Moneo
Member

Откуда:
Сообщений: 59
Я разобрался с прошлой проблемой, но сервер очень медленно обрабатывает запросы (максимум 2.5 в секунду, потом выдает ошибки в теле). Может есть готовый инструментарий который может отправлять множество запросов с изменением лишь одного параметра используя прокси сервера или мне самому писать сбор прокси серверов и потом уже с их помощью отправлять эти запросы? Мне нужно отправить 7млн запросов с изменением одного параметра, отправить несколько значений в одном запросе не представляется возможным с стороны сервера.
27 апр 19, 16:34    [21873393]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3396
Moneo,

я слабо себе представляю как можно решить проблему медленного сервера на клиенте. делать сотни параллельных запросов? ну если сервер так разрешит, то можно пробовать.
27 апр 19, 16:49    [21873398]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
x1ca4064
Member

Откуда:
Сообщений: 1008
makhaon
Moneo,

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

Скоре всего, сервер ограничивает скорость запросов с одного IP, прокси могут помочь.

Moneo: Поищите сборщики проксей - за малую деньгу просто получите готовый список в json/xml
27 апр 19, 17:49    [21873429]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
Moneo
Member

Откуда:
Сообщений: 59
Прикупил 10 прокси, но все равно сервер на половину запросов шлет ошибку :
{"alerts":[{"type":"danger","msg":"Can't find API for apiName = undefined","errorCode":"Can't find API for apiName = undefined"}]}

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

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;
7 май 19, 15:16    [21880053]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
alekcvp
Member

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

Я не помню как работает httpsend, но тут точно не надо
Data := TStringStream.Create('');
 Data.WriteString('{"lang":"rus","apiName":"contragent","apiPath":"/contragentEk5/getDynamics","filter":{"code":"'+code+'"}}');
 Data.Position := 0; // ? 
 HTTPs.Document.LoadFromStream(Data);
7 май 19, 19:25    [21880330]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3396
alekcvp,

не нужно знать как работает httpsend, достаточно знать как работает TStream. там точно надо
7 май 19, 20:14    [21880373]     Ответить | Цитировать Сообщить модератору
 Re: Многопоточность  [new]
Moneo
Member

Откуда:
Сообщений: 59
все еще тоже самое
8 май 19, 12:19    [21880841]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить