Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Многопоточность / 25 сообщений из 26, страница 1 из 2
23.04.2019, 16:25
    #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
23.04.2019, 17:38
    #39805500
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
Moneo,

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

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

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

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

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

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

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

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

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

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

    end;

HTTPs.free;


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

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

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

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

Moneo: Поищите сборщики проксей - за малую деньгу просто получите готовый список в json/xml
...
Рейтинг: 0 / 0
07.05.2019, 15:16
    #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
07.05.2019, 19:25
    #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
07.05.2019, 20:14
    #39810925
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточность
alekcvp,

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


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