gawk, чтобы прочитать последний бит двоичных данных по каналу без тайм-аута?

У меня есть программа, уже написанная на gawk, которая загружает множество небольших фрагментов информации из Интернета. (Медиа-сканер и индексатор)

В настоящее время для получения информации запускается wget. Это нормально, но я бы хотел просто повторно использовать соединение между вызовами. Возможно, запуск программы может сделать от 200 до 2000 вызовов одной и той же службы api.

Я только что обнаружил, что gawk может работать в сети, и нашел geturl Однако к совету внизу этой страницы прислушиваются, я не могу найти простой способ прочитать последнюю строку и оставить соединение открытым.

Поскольку я в основном читаю данные JSON, я могу установить RS = "}" и выйти, когда длина тела достигнет ожидаемой длины содержимого. Однако это может прерваться с любым конечным белым пространством. Мне нужен более надежный подход. Есть ли у кого-нибудь более приятный способ реализовать спорадические HTTP-запросы в awk, которые поддерживают соединение. На данный момент у меня такая структура ...

con="/inet/tcp/0/host/80";

send_http_request(con);

RS="\r\n";

read_headers();

# now read the body - but do not close the connection...
RS="}"; # for JSON
while ( con |& getline bytes ) {
    body = body bytes RS;
    if (length(body) >= content_length) break;
    print length(body);
}
# Do not close con here - keep open

Жаль, что эта маленькая вещь, кажется, портит весь потенциал здесь. Также на случай, если кто-нибудь спросит :) ..

  • Первоначально awk был выбран по историческим причинам - в то время на этой встроенной платформе было не так много других языков.
  • Собрать все URL заранее и передать в wget будет непросто.
  • повторная реализация в perl / python и т. д. не является быстрым решением.
  • Я посмотрел на попытку передать URL-адреса в именованный канал и в wget -i -, это не сработает. Данные буферизуются, а unbuffer недоступен - также я думаю, что wget собирает все URL-адреса до EOF перед обработкой.
  • Данных мало, поэтому отсутствие сжатия не является проблемой.

person ydrol    schedule 05.04.2012    source источник
comment
Справедливо ли заменять только wget часть? Я должен думать, что написать замену для wget, которая остается, считывает URL-адреса со стандартного ввода и записывает данные в стандартный вывод, было бы намного проще, чем пытаться встроить функциональность в сценарий gawk.   -  person sarnold    schedule 06.04.2012
comment
Хотя это не отвечает на ваш вопрос, но вы можете найти это обсуждение, имеющее некоторую ценность: groups.google.com/forum / #! topic / comp.lang.awk / RinvdXVq11o. Есть и другие обсуждения, поиск по wget и inet / tcp. Удачи, и если вы в этом разобрались, опубликуйте свой ответ!   -  person shellter    schedule 06.04.2012
comment
Просто быстрое обновление, я реализовал хакерскую версию, которая будет проверять хост, тип контента и кодировку контента, чтобы выбрать лучший разделитель для использования. Повторное использование соединений в порядке, но в этой конкретной встроенной системе (NMT) все приросты производительности от повторного использования соединения были потеряны из-за скорости чтения тела (или, возможно, общей скорости ввода-вывода / строки). Никакой реальной выгоды от создания дополнительного процесса wget.   -  person ydrol    schedule 07.04.2012
comment
@sarnold - я могу это сделать в какой-то момент. Я потратил на это больше времени, чем должен был, и мне нечего было показать, но я узнал о сети gawk и о том, как обрабатывать фрагментированное кодирование :)   -  person ydrol    schedule 07.04.2012
comment
@shelter - Спасибо - это похоже на случай использования правильного инструмента для правильной работы. Жаль, что одно небольшое изменение кода для wget было бы действительно полезно.   -  person ydrol    schedule 07.04.2012
comment
@ydrol: Можем ли мы следить за этим в автономном режиме. Возможно, у меня будет время поработать над этим. См. Мою контактную информацию stackoverflow.com/users/620097/shellter.   -  person shellter    schedule 12.04.2012


Ответы (1)


Проблема с повторным использованием соединения исходит из стандарта HTTP 1.0, а не из-за gawk. Чтобы повторно использовать соединение, вы должны либо использовать HTTP 1.1, либо попробовать другие нестандартные решения для HTTP 1.0 . Не забудьте добавить заголовок Host: в свой запрос HTTP / 1.1, так как он является обязательным.

Вы правы насчет отсутствия надежности при чтении тела ответа. Для линейно-ориентированных протоколов это не проблема. Более того, даже при использовании HTTP 1.1, если ваши сценарии блокируются в ожидании дополнительных данных, а не должны, сервер снова закроет соединение из-за бездействия.

В крайнем случае, вы можете написать свой собственный HTTP-поисковик на любом языке, который вам нравится, который повторно использует соединения (все с одним и тем же удаленным хостом, как я полагаю), а также вставляет для вас специальный разделитель записей. Затем вы можете управлять им из сценария awk < / а>.

person C2H5OH    schedule 06.04.2012
comment
Спасибо за ответ, я использую HTTP 1.1 нормально, и повторное подключение выполняется очень хорошо в awk. просто, как вы указываете, если я не прочитал самый последний байт тела ответа, тогда соединение не может быть повторно использовано, и если я попытаюсь прочитать слишком много, оно заблокирует ожидание дополнительных входных данных от сервера. - person ydrol; 06.04.2012