2014-04-02 83 views
2

AnyEvent::HTTPAnyEvent :: HTTP基本的例子不工作

試圖在Debian和CentOS,都用Perl 5.10

一點聲音有什麼用模塊根本打破,或我是否需要更新的perl版本,儘管我會期望對此有所抱怨?

編輯

所以我需要事件循環,有沒有一些簡單的例子,這將顯示出AE::HTTP使用?

+0

我喜歡[這個解釋](http://perlmaven.com/fetching-several-web-pages-in-parallel-using-anyevent)。 – reinierpost

回答

5

問題是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; 
+0

@ikegami:隨意修改我的問題。我沒有想到,'睡眠'應該允許回調運行。 – Borodin

+0

@ikegami和鮑羅丁,這個解決方案使用的事件循環,我應該關心,我該如何改變它? –

+1

如果AnyEvent發現系統上安裝了EV,那麼它將使用它。否則,它將使用自己的純Perl後端。除非你的程序已經有一個事件系統,比如像Wx或Gtk這樣的GUI系統,否則它不應該成爲你使用的問題。還有可能你需要比純Perl後端更快的東西,但這是不太可能的,因爲你的程序可能是網絡綁定的。 – Borodin

1

您可能需要進一步閱讀,而不是停留在第一個不完整的示例中。 描述中的第一句話是:

這個模塊是一個AnyEvent用戶,你需要確保你使用 並運行支持的事件循環。

有關AnyEvent *的基本用法(例如事件循環等)的文檔,請參閱AnyEvent文檔。

+0

但是[AnyEvent'的文檔](https://metacpan.org/module/AnyEvent)說,*「如果EV沒有安裝,那麼AnyEvent將回退到它自己的純perl實現,這是可用的因爲它帶有AnyEvent本身「* – Borodin

+0

@mpapec:這是否解決了您的問題?我想了解,因爲我無法做到這一點。 – Borodin

+0

Steffen,我已經更新了這個問題。 –