Тема: AHK: Запросы к серверу в несколько потоков
Здравствуйте.
Работаю с системой маркировки товара "Честный знак".
Возникла такая задача: перед загрузкой документа с кодами маркировки в систему нужно проверить статус ("в обороте", "выбыл") и текущего владельца кода маркировки.
Написал скрипт, который обращается к API системы и получает нужные данные.
Столкнулся с тем, что на больших списках кодов проверка длится очень долго (в среднем 2-3 секунды на один запрос).
Фрагмент кода:
; В начале скрипта происходит авторизация в системе, получаем от сервера Auth.token, который затем передается в заголовке каждого запроса
Loop, read, %inputFile%, %outFile%
{
if a_Index <5 ; Заголовок таблицы
{
FileAppend, %A_LoopReadLine%`n
continue
}
; Парамерты
cis := SubStr(A_LoopReadLine, 1, 31)
cis := URIEncode(cis) ; Экранируем символы для передачи в GET запросе
url := "https://markirovka.crpt.ru/api/v3/true-api/products/listV2?cis=" . cis
; /Параметры
; Запрос
HTTP.Open("GET", url, true)
HTTP.SetRequestHeader("Authorization", "Bearer " . Auth.token)
HTTP.Send()
HTTP.WaitForResponse()
ResponseText := HTTP.ResponseText
; /Запрос
; Обработка ответа
FoundPos := RegExMatch(ResponseText, "O)\[(\{.*\})\]", Match)
ResponseText := Match.1
JSONobj := JSON.Parse(ResponseText)
txtLine := JSONobj.cis . "`tagent: " . JSONobj.agentInn . "`tstatus: " . JSONobj.status . "`n"
FileAppend %txtLine%
; /Обработка ответа
echo(A_Index) ;Выводим в консоль номер текущей строки файла, чтобы видеть прогресс выполнения
}
MsgBox Проверка завершена
ExitApp
Вопрос: Можно ли как-то выполнять несколько запросов параллельно, не дожидаясь ответа на предыдущие запросы, и обрабатывать ответы по мере поступления?
Была задумка вынести блоки "Запрос" и "Обработка ответа" в отдельный дочерний скрипт и запускать несколько его экземпляров с параметрами url и Auth.token. Но тут тоже могут быть проблемы. Во-первых, если один экземпляр откроет outFile для записи, остальные должны дождаться его закрытия, а я не знаю, как это реализовать. Во-вторых, основной скрипт должен как-то отслеживать количество запущенных экземпляров дочернего, поскольку API имеет ограничения по количеству запросов в секунду.
Буду рад любым идеям, желательно с примерами реализации.