Застрял на использовании Net::HTTP когда я создаю объект Net::HTTP, он инициализируется с помощью «IO::Socket::IP». как я могу изменить сокет по умолчанию без жесткого кодирования? Я хотел бы изменить его на IO::Socket::INET.
Так что, если я жестко кодирую сокет, он работает. Но когда я пытаюсь использовать Coro::LWP и Coro::LWP изменяет IO::Socket::INET на Coro::Socket, я получаю сообщение об ошибке:
Ошибка чтения состояния: конечная точка транспорта не подключена к perl5/lib/perl5/Net/HTTP/Methods.pm, строка 282.
Мне нужно изменить сокет, потому что модуль Clickhouse на cpan не поддерживает асинхронные запросы.
вот код который не работает
use IO::Socket::INET qw( );
BEGIN { $Net::HTTP::SOCKET_CLASS = 'IO::Socket::INET'; };
use Coro::LWP;
my $s = Net::HTTP->new(Host => "www.perl.com") || die $@;
$s->write_request(GET => "/");
print $_ for ( $s->read_response_headers );
фиксированный! просто замените Coro::Socket на Coro::PatchSet::Socket
Я написал LWP::Protocol::AnyEvent::http, который буду использовать поверх Coro::LWP. При этом ClickHouse не использует LWP?!?
Вы не можете использовать IO::Socket::INET или IO::Socket::IP с Coro. Coro — это кооперативная многопоточная система, поэтому она работает только с взаимодействующими модулями, и ни один из этих модулей не поддерживает Coro. (Под «работой» я подразумеваю выполнение потоков и асинхронных операций.)
Помимо прочего, Coro::LWP специально заставляет Net::HTTP использовать Coro::LWP::Socket вместо IO::Socket::INET. Ваши попытки заставить Net::HTTP использовать IO::Socket::IP контрпродуктивны.
Вы сказали, что переключаете модуль, потому что Clickhouse (под чем я полагаю, вы имели в виду ClickHouse) не поддерживает асинхронные запросы, но замена IO::Socket::INET на IO::Socket::IP не помогает с этим на все.
Вы смотрели AnyEvent::ClickHouse?
> Coro::LWP специально заставляет Net::HTTP использовать Coro::LWP::Socket вместо IO::Socket::INET. Я не пытаюсь изменить его на IO::Socket::IP IO::Socket:: IP является сокетом по умолчанию, когда вы пытаетесь создать клиент Net::HTTP. поэтому мне нужно изменить его на IO::Socket::INET, поэтому Coro::LWP заменит его на Coro::LWP::Socket. но когда Coro::LWP заменил сокет на Coro::LWP::Socket, у меня возникла ошибка при попытке отправить запрос.
ойк. Работа над ошибкой в Coro::LWP. Обычно я предлагаю обратиться к автору, но с этим конкретным автором очень сложно иметь дело. Хотя то, что вы сказали, не совсем правда. ::IP используется по умолчанию только в том случае, если установлен ::IP и если класс не указан заранее. Поместите это в начале своей программы: use IO::Socket::INET qw( ); BEGIN { $Net::HTTP::SOCKET_CLASS = 'IO::Socket::INET'; }
Спасибо! я жестко запрограммировал внутри Net::HTTP :) я отредактировал основную часть вопроса, не могли бы вы проверить код?
Добавленный вами код использует Coro::LWP::Socket (вместо IO::Socket::IP или IO::Socket::INET) в качестве базового класса для Net::HTTP (что вы можете проверить, изучив @Net::HTTP::ISA
) . Опять же, если у вас возникли проблемы, возможно, вам следует прекратить взламывать решение и использовать AnyEvent::ClickHouse. AnyEvent и Coro совместимы.
Кажется, я больше не могу установить Coro на свой компьютер, поэтому я не могу запустить код, чтобы проверить, работает ли он у меня.
Это похоже на проблема XY. Возможно, было бы полезнее описать исходную проблему X, которую вы пытаетесь решить, а не просто передавать некоторые фрагменты ваших попыток решить проблему Y, с которой вы столкнулись при попытке решить X. См. также Как создать минимальный воспроизводимый пример.