Тема: AHK: Асинхронная отправка нескольких запросов и получение ответов
Есть скрипт, с примерно такой логикой (абстракция):
Пользователь отправляет n веб-запросов на веб-сервер (imgur), сервер их какое-то время обрабатывает, а потом отсылает ответы. Текстовые ответы надо поймать и (распарсенные) сохранить в буфер обмена.
Хочу, чтоб это делалось асинхронно, т.е. чтобы для отправки второго запроса не требовалось дождаться ответа на первый запрос.
Помогите разобраться с тем, как лучше запрограммировать такую логику.
У меня в скрипте с синхронной работой отправка производится так:
1. есть массив/объект с запросами для отправки.
2. этот объект передаётся аргументом к функции.
3. функция сначала один раз создаёт объект, к которому привязывается ComObject("WinHttp.WinHttpRequest.5.1")
4. затем функция циклически (for key in argObj) перебирает объект в аргументе, каждый раз выполняя:
httpObj.Open("POST", url) ; открываем форму для запроса
httpObj.Send(request%k%) ; отправка данных (каждый раз разные) из перебираемого объекта.
clipboard := clipboard . httpObj.ResponseText ; собираем в переменную ответ сервера
5. с последним запросом функция завершает свою работу
С переходом на асинхронный подход возникли проблемы: нагуглился такой пример асинхронной работы.
Т.е. после отправки первого запроса выставляется таймер на однократное выполнение метки (label) (которая начинается с HttpObj1.WaitForResponse() и тем самым сначала ждёт ответа от сервера, а дальнейшие команды выполняются только после его получения).
Сразу после того, как таймер был выставлен - скрипт продолжает свою работу и переходит к следующему запросу, который аналогичным образом выставляет ещё один таймер на однократное выполнение уже другой метки.
Такое решение мне подходит, т.к. получается, что если надо выполнить очередь из 20 асинхронных запросов к серверу и потом собрать 20 ответов на них, то нам надо создавать 20 отдельных объектов, 20 меток (и потом ещё как-то скоординировать их дальнейшую работу, ведь по условием задачи - нам надо всё записать в одну переменную и её содержимое запихнуть в clipboard, а ещё ведь может захотеться и пользователю как-то сообщать о прогрессе выполнения задачи).
Мне не хочется плодить метки (т.к. подразумевается, что запросов может быть аж до 255шт) и не хотелось бы плодить объекты без необходимости (т.е. если это необходимо - то ладно).
Как же правильно решить такую проблему?
И т.к. я до этого ни разу не работал с асинхронностью, то сразу сопутствующий вопрос: есть какие-то писанные/неписанные стандарты о том, какой должна быть пауза между запросами и какая скорость запросов обычно считается приемлемой? или это всё сильно зависит от сервера и лучше узнать опытным путём?