【问题标题】:AnyEvent::HTTP basic example not workingAnyEvent::HTTP 基本示例不起作用
【发布时间】:2014-04-02 21:02:05
【问题描述】:

AnyEvent::HTTP

在 Debian 和 Centos 上试过,都使用 perl 5.10

没有声音

perl -Mstrict -we 'use AnyEvent::HTTP; http_get "http://www.nethype.de/", sub { print $_[1] }; sleep 20'

模块是否存在根本性的问题,或者我是否需要更新的 perl 版本,尽管我预计会对此提出投诉?

编辑

所以我需要事件循环,有没有一些简单的例子可以演示AE::HTTP 的用法?

【问题讨论】:

标签: perl anyevent


【解决方案1】:

问题在于sleep,不是 AnyEvent 的一部分,不会执行允许 AnyEvent::HTTP 异步获取的事件循环。阻止时,您希望使用可感知 AE 的东西(例如条件变量)进行阻止。

此程序创建一个名为$exit_wait 的条件变量,然后发出 HTTP 请求。在发出请求并收到响应时,程序可以继续运行。

一旦程序到达需要来自 HTTP 请求的信息的地步,它就会在条件变量上调用recv。这允许回调在 HTTP 请求也完成时触发。它所做的只是转储$headers 哈希。

在这种情况下,我编写了它以便回调也对条件变量执行send,这会导致程序结束其recv 调用并继续。没有它,程序将处于无限等待状态。

如果不了解您的应用程序,我将无法提供更多帮助。

use strict;
use warnings;

use AnyEvent::HTTP;
use Data::Dump;

STDOUT->autoflush;

my $exit_wait = AnyEvent->condvar;

my $handle = http_request
  GET => 'http://www.nethype.de/',
  sub {
    my ($body, $headers) = @_;
    dd $headers;
    $exit_wait->send;
  };

# Do stuff here

$exit_wait->recv;

【讨论】:

  • @ikegami:请随时修改我的问题。我没有想到 sleep 应该允许回调运行。
  • @ikegami 和 Borodin,这个解决方案使用哪个事件循环,我应该关心,我该如何更改它?
  • 如果AnyEvent 发现系统上安装了EV,那么它将使用它。否则它将使用自己的纯 Perl 后端。除非您的程序已经有一个事件系统,如 Wx 或 Gtk 之类的 GUI 系统,否则使用哪个对您来说应该不是问题。您也可能需要比纯 Perl 后端更快的东西,但这不太可能,因为您的程序可能是网络绑定的。
  • @mpapec,您只需要知道->recv 来自AE,因此它将允许事件循环运行。循环本身是什么并不重要(除非您希望它是一个特定的循环,因为应用程序的其余部分都在使用它)。
【解决方案2】:

除了停留在第一个不完整的示例之外,您可能还需要进一步阅读。 描述中的第一句话是:

这个模块是AnyEvent用户,你需要确保你使用 并运行支持的事件循环。

有关 AnyEvent* 基本用法的文档(例如事件循环等),请参阅 AnyEvent 文档。

【讨论】:

  • 但是documentation for AnyEvent 说,“如果没有安装 EV,那么 AnyEvent 将回退到它自己的纯 perl 实现,它随 AnyEvent 本身提供,随处可用”
  • @mpapec:这解决了您的问题吗?我想知道我怎么也做不到。
  • 如果文档中提到如何“成为 AnyEvent 用户”会很有帮助。 AnyEvent 文档并没有说得很清楚。
猜你喜欢
  • 1970-01-01
  • 2015-09-22
  • 2018-06-03
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
相关资源
最近更新 更多