【问题标题】:How to use "Net::http" in Coro?如何在 Coro 中使用“Net::http”?
【发布时间】:2019-10-14 23:05:03
【问题描述】:

卡在使用 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

【问题讨论】:

标签: perl sockets asynchronous net-http


【解决方案1】:

您不能将 IO::Socket::INET 或 IO::Socket::IP 与 Coro 一起使用。 Coro 是一个协作式多线程系统,所以它只与协作模块一起工作,而这些模块都不是 Coro 感知的。 (“工作”是指允许线程和异步操作进行。)

除其他外,Coro::LWP 还特别使 Net::HTTP 使用 Coro::LWP::Socket 而不是 IO::Socket::INET。您尝试让 Ne​​t::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 时,尝试发送请求时出现错误。
  • oic。解决 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,所以我无法运行代码来查看它是否适合我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 2012-12-13
  • 2018-02-12
  • 2017-05-04
  • 2011-01-31
  • 2015-08-31
  • 1970-01-01
相关资源
最近更新 更多