<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Запросы к серверу в несколько потоков]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=15500&amp;type=atom" />
	<updated>2020-07-03T11:41:24Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=15500</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запросы к серверу в несколько потоков]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=140535#p140535" />
			<content type="html"><![CDATA[<p>Заработало!<br />Проверка правда все равно длится долго, но это уже проблемы на стороне сервера.&nbsp; <br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Лог</div><div class="fancy_spoiler"><p>14:33:09 Request # 1<br />14:33:09 Request # 2<br />14:33:10 Request # 3<br />14:33:10 Request # 4<br />14:33:10 Request # 5<br />14:33:10 Request # 6<br />14:33:10 Request # 7<br />14:33:11 Request # 8<br />14:33:11 Request # 9<br />14:33:11 Request # 10<br />14:33:11 Request # 11<br />14:33:11 Request # 12<br />14:33:12 Request # 13<br />14:33:12 Request # 14<br />14:33:12 Request # 15<br />14:33:12 Request # 16<br />14:33:12 Request # 17<br />14:33:13 Request # 18<br />14:33:13 Response # 1<br />14:33:13 Request # 19<br />14:33:13 Response # 2<br />14:33:13 Request # 20<br />14:33:13 Request # 21<br />14:33:13 Request # 22<br />14:33:14 Request # 23<br />14:33:14 Request # 24<br />14:33:14 Request # 25<br />14:33:14 Request # 26<br />14:33:14 Request # 27<br />14:33:15 Request # 28<br />14:33:15 Request # 29<br />14:33:15 Request # 30<br />14:33:15 Request # 31<br />14:33:15 Request # 32<br />14:33:15 Response # 3<br />14:33:16 Request # 33<br />14:33:16 Response # 4<br />14:33:16 Request # 34<br />14:33:16 Request # 35<br />14:33:16 Request # 36<br />14:33:17 Request # 37<br />14:33:17 Request # 38<br />14:33:17 Request # 39<br />14:33:17 Request # 40<br />14:33:17 Request # 41<br />14:33:18 Request # 42<br />14:33:18 Request # 43<br />14:33:18 Request # 44<br />14:33:18 Request # 45<br />14:33:18 Response # 5<br />14:33:18 Request # 46<br />14:33:19 Request # 47<br />14:33:19 Request # 48<br />14:33:19 Request # 49<br />14:33:19 Request # 50<br />14:33:19 Response # 6<br />14:33:19 Request # 51<br />14:33:21 Response # 7<br />14:33:24 Response # 9<br />14:33:53 Response # 8<br />14:33:56 Response # 11<br />14:33:59 Response # 12<br />14:34:00 Response # 10<br />14:34:02 Response # 13<br />14:34:03 Response # 14<br />14:34:05 Response # 15<br />14:34:07 Response # 16<br />14:34:08 Response # 17<br />14:34:11 Response # 18<br />14:34:12 Response # 19<br />14:34:13 Response # 21<br />14:34:14 Response # 20<br />14:34:18 Response # 22<br />14:34:21 Response # 23<br />14:34:22 Response # 25<br />14:34:23 Response # 26<br />14:34:25 Response # 27<br />14:34:29 Response # 24<br />14:34:32 Response # 29<br />14:34:39 Response # 30<br />14:34:42 Response # 31<br />14:34:45 Response # 32<br />14:34:48 Response # 33<br />14:34:51 Response # 34<br />14:34:57 Response # 35<br />14:35:00 Response # 36<br />14:35:01 Response # 28<br />14:35:02 Response # 37<br />14:35:02 Response # 38<br />14:35:03 Response # 40<br />14:35:05 Response # 39<br />14:35:07 Response # 41<br />14:35:09 Response # 42<br />14:35:28 Response # 43<br />14:35:31 Response # 45<br />14:35:33 Response # 46<br />14:35:36 Response # 47<br />14:35:39 Response # 48<br />14:35:42 Response # 49<br />14:35:45 Response # 50<br />14:35:48 Response # 44<br />14:36:31 Response # 51<br />&gt;Exit code: 0&nbsp; &nbsp; Time: 220.1</p></div></div><p>Спасибо огромное за помощь!</p>]]></content>
			<author>
				<name><![CDATA[KepocuH]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=28557</uri>
			</author>
			<updated>2020-07-03T11:41:24Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=140535#p140535</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запросы к серверу в несколько потоков]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=140525#p140525" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>link1 := &quot;http://forum.script-coding.com&quot;
link2 := &quot;https://www.google.lv&quot;
loop 2
{
   req%A_Index% := ComObjCreate(&quot;Msxml2.XMLHTTP&quot;)
   req%A_Index%.Open(&quot;GET&quot;,link%A_Index%,true)
   req%A_Index%.onreadystatechange := Func(&quot;Ready&quot;).Bind(A_Index)
   req%A_Index%.send()
}
msgbox done
return


Ready(n)
{
   if (req%n%.readyState != 4)
      return
   msgbox % req%n%.responseText
   return
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2020-07-02T10:33:02Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=140525#p140525</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запросы к серверу в несколько потоков]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=140523#p140523" />
			<content type="html"><![CDATA[<p>Проблема подкралась откуда не ждал.<br />Оказывается, если создавать новый COM-объект winhttprequest, то для него токен, полученный другим winhttprequest&#039;ом, является недействительным. Авторизация слетает, и API не выдает результат.<br />Отсюда вывод: запускать кучу дочерних скриптов не имеет смысла.</p><p>Вопрос многопоточности остается актуальным.</p><p>Ушел гуглить Msxml2.XMLHTTP.</p><p>UPD: Почитал. Оно умеет в асинхронные запросы, но обрабатывать ответы в ahk все равно приходится синхронно. Так что в моем случае отличий от winhttprequest нет.<br />Видимо, реализовать задачу в рамках ahk невозможно.</p>]]></content>
			<author>
				<name><![CDATA[KepocuH]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=28557</uri>
			</author>
			<updated>2020-07-02T08:30:42Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=140523#p140523</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запросы к серверу в несколько потоков]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=140515#p140515" />
			<content type="html"><![CDATA[<p>Асинхронно в одном скрипте через winhttprequest объект не получится, читайте про Msxml2.XMLHTTP.<br />А также:<br /><a href="http://forum.script-coding.com/viewtopic.php?id=10765">http://forum.script-coding.com/viewtopic.php?id=10765</a></p>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2020-07-01T17:21:17Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=140515#p140515</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запросы к серверу в несколько потоков]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=140514#p140514" />
			<content type="html"><![CDATA[<p>Да, нужен &quot;слушатель&quot;, вполне возможно, что это не самый подходящий вариант; у меня нет опыта по Std out. Я перечислил известные варианты вывода информации, смотрите что Вам ближе и понятнее.</p>]]></content>
			<author>
				<name><![CDATA[ypppu]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5974</uri>
			</author>
			<updated>2020-07-01T16:11:44Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=140514#p140514</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запросы к серверу в несколько потоков]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=140512#p140512" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>ypppu пишет:</cite><blockquote><p>Если API имеет ограничения по количеству запросов, почему Вы решили, что можно обрабатывать ответы по мере поступления? Может запрос был проигнорирован из-за ограничения по количеству запросов в секунду, и ждать ответа на него уже не имеет смысла. А может не был проигнорирован, просто проверка списка кодов длилась долго. До каких пор ждать?</p></blockquote></div><p>API имеет ограничение в 10 запросов в секунду от одного клиента.<br />Один запрос выполняется в среднем 2-3 секунды. Иногда быстрее, бывает что дольше. Случается, что и по 10-15 секунд длится ожидание ответа.<br />Мой скрипт, как он есть сейчас, работает последовательно, то есть выполняет запросы по мере поступления ответов.<br />Вот так:<br />Запрос №1 --&gt; ожидание --&gt; ответ №1 --&gt; обработка №1 --&gt; запрос №2 --&gt; ожидание --&gt; ответ №2 ... и так далее<br />Я же хочу что-то вроде:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><p>0000 мс: запрос №1<br />0200 мс: запрос №2<br />0400 мс: запрос №3<br />0600 мс: запрос №4<br />0521 мс: опа! пришел ответ №1 --&gt; обработка №1<br />0800 мс: запрос №5<br />1000 мс: запрос №6<br />1111 мс: ага, пришел ответ №2<br />1112 мс: тем временем пришел ответ №3 --&gt; обработка №2 --&gt; обработка №3<br />1200 мс: запрос №7<br />1321 мс: ответ №5, ответ 4 где-то задерживается, ждем<br />1400 мс: запрос №8<br />1445 мс: наконец-то ответ №4 --&gt; обработка №4 --&gt; обработка №5<br />1600мс: запрос №9<br />...<br />и так далее</p></div></div><p>Как отправлять запросы, я кажется догадываюсь...<br /></p><div class="codebox"><pre><code>
loop, read, %inputFile%
{
url := MakeURL(A_LoopReadLine) ; подготавливаем URL для запроса
Run, %A_AhkPath% HttpRequest.ahk url Auth.token
sleep 200
}
</code></pre></div><p>А вот как получать ответы, пока не понимаю.<br /></p><div class="quotebox"><cite>ypppu пишет:</cite><blockquote><p>существует Std out, обмен оконными сообщениями, отправка сообщений в порт.</p></blockquote></div><p>Для этого, наверное, нужен какой-нибудь &quot;слушатель&quot;, кто будет отслеживать появление сообщений от дочерних скриптов и сообщать им, что сообщение таки дошло куда надо. Так вот, кто будет этим заниматься, если основной скрипт занят запуском все новых и новых экземпляров дочернего? Или это как-то по другому работает?</p>]]></content>
			<author>
				<name><![CDATA[KepocuH]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=28557</uri>
			</author>
			<updated>2020-07-01T14:30:44Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=140512#p140512</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Запросы к серверу в несколько потоков]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=140511#p140511" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>Вопрос: Можно ли как-то выполнять несколько запросов параллельно, не дожидаясь ответа на предыдущие запросы, и обрабатывать ответы по мере поступления?</p></blockquote></div><div class="quotebox"><blockquote><p>API имеет ограничения по количеству запросов в секунду</p></blockquote></div><p>Если API имеет ограничения по количеству запросов, почему Вы решили, что можно обрабатывать ответы по мере поступления? Может запрос был проигнорирован из-за <span style="color: #800000">ограничения по количеству запросов в секунду</span>, и ждать ответа на него уже не имеет смысла. А может не был проигнорирован, просто проверка списка кодов длилась долго. До каких пор ждать?</p><p>Вообще можно сделать, чтобы каждый дочерний скрипт записывал в свой файл, а главный скрипт эти файлы периодически читал. Ещё существует Std out, обмен оконными сообщениями, отправка сообщений в порт. Можно сделать, чтобы каждый дочерний скрипт имел GUI-окно и выводил в него текст, а главный скрипт периодически считывал этот текст и удалял то, что уже прочитал.</p>]]></content>
			<author>
				<name><![CDATA[ypppu]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5974</uri>
			</author>
			<updated>2020-07-01T12:36:21Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=140511#p140511</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Запросы к серверу в несколько потоков]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=140510#p140510" />
			<content type="html"><![CDATA[<p>Здравствуйте.<br />Работаю с системой маркировки товара &quot;Честный знак&quot;. <br />Возникла такая задача: перед загрузкой документа с кодами маркировки в систему нужно проверить статус (&quot;в обороте&quot;, &quot;выбыл&quot;) и текущего владельца кода маркировки.<br />Написал скрипт, который обращается к API системы и получает нужные данные.<br />Столкнулся с тем, что на больших списках кодов проверка длится очень долго (в среднем 2-3 секунды на один запрос).</p><p>Фрагмент кода:<br /></p><div class="codebox"><pre><code>
; В начале скрипта происходит авторизация в системе, получаем от сервера Auth.token, который затем передается в заголовке каждого запроса

Loop, read, %inputFile%, %outFile%
{
if a_Index &lt;5 ; Заголовок таблицы
{
	FileAppend, %A_LoopReadLine%`n
	continue
}

; Парамерты 
cis := SubStr(A_LoopReadLine, 1, 31)
cis := URIEncode(cis) ; Экранируем символы для передачи в GET запросе
url := &quot;https://markirovka.crpt.ru/api/v3/true-api/products/listV2?cis=&quot; . cis
; /Параметры

; Запрос
HTTP.Open(&quot;GET&quot;, url, true)
HTTP.SetRequestHeader(&quot;Authorization&quot;, &quot;Bearer &quot; . Auth.token)
HTTP.Send()
HTTP.WaitForResponse()
ResponseText := HTTP.ResponseText
; /Запрос

; Обработка ответа
FoundPos := RegExMatch(ResponseText, &quot;O)\[(\{.*\})\]&quot;, Match)
ResponseText := Match.1
JSONobj := JSON.Parse(ResponseText)
txtLine := JSONobj.cis . &quot;`tagent: &quot; . JSONobj.agentInn . &quot;`tstatus: &quot; . JSONobj.status . &quot;`n&quot;
FileAppend %txtLine%
; /Обработка ответа

echo(A_Index) ;Выводим в консоль номер текущей строки файла, чтобы видеть прогресс выполнения
}
MsgBox Проверка завершена
ExitApp
</code></pre></div><p>Вопрос: Можно ли как-то выполнять несколько запросов параллельно, не дожидаясь ответа на предыдущие запросы, и обрабатывать ответы по мере поступления? <br />Была задумка вынести блоки &quot;Запрос&quot; и &quot;Обработка ответа&quot; в отдельный дочерний скрипт и запускать несколько его экземпляров с параметрами url и Auth.token. Но тут тоже могут быть проблемы. Во-первых, если один экземпляр откроет outFile для записи, остальные должны дождаться его закрытия, а я не знаю, как это реализовать. Во-вторых, основной скрипт должен как-то отслеживать количество запущенных экземпляров дочернего, поскольку API имеет ограничения по количеству запросов в секунду.<br />Буду рад любым идеям, желательно с примерами реализации.</p>]]></content>
			<author>
				<name><![CDATA[KepocuH]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=28557</uri>
			</author>
			<updated>2020-07-01T09:56:19Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=140510#p140510</id>
		</entry>
</feed>
