Как использовать «Net :: http» в Coro? - PullRequest
0 голосов
/ 29 мая 2019

Застрял на использовании 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

1 Ответ

3 голосов
/ 29 мая 2019

Вы не можете использовать 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 ?

...