如何在 Coro 中使用 "Net::http"?

How to use "Net::http" in Coro?

无法使用 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 行未连接传输端点。

我需要更改套接字,因为 cpan 上的 Clickhouse 模块不支持异步请求。

这是无效的代码

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

您不能对 Coro 使用 IO::Socket::INET 或 IO::Socket::IP。 Coro 是一个 co-operative multi-threading 系统,因此它只能与 co-operating 模块一起使用,而这些模块都不是 Coro-aware。 ("work",我的意思是允许线程和异步操作进行。)

除其他事项外,Coro::LWP 特别让 Net::HTTP 使用 Coro::LWP::Socket 而不是 IO::Socket::INET。您使 Net::HTTP 使用 IO::Socket::IP 的尝试是 counter-productive.

你说你要切换模块是因为 Clickhouse(我假设你指的是 ClickHouse)不支持异步请求,但是用 IO::Socket::IP 替换 IO::Socket::INET 并没有帮助完全没有。

你看过AnyEvent::ClickHouse了吗?