gpt4 book ai didi

multithreading - 为什么 URI 对象不能定位方法 "scheme"?

转载 作者:可可西里 更新时间:2023-11-01 17:02:12 26 4
gpt4 key购买 nike

我正在尝试使用以下源代码创建异步 http 请求客户端:

#!perl

use URI;
use DDP;
use threads;
use Thread::Queue;
use LWP::UserAgent;

use constant NUM_WORKERS => 25;

my $req_q = Thread::Queue->new();
my $res_q = Thread::Queue->new();

my @urls = ( "http://google.com", "http://web.de" );

my @workers;
for ( 1 .. NUM_WORKERS ) {
push @workers, async {
my $ua = LWP::UserAgent->new();
while ( my $req = $req_q->dequeue() ) {
$res_q->enqueue( $ua->request($req) );
}
};
}

for my $url (@urls) {
$req_q->enqueue( HTTP::Request->new( GET => $url ) );
}

$req_q->enqueue(undef) for @workers;

for ( 1 .. @urls ) {
my $res = $res_q->dequeue();
p $res;
}

$_->join() for @workers;

不幸的是我收到错误:

400 Can't locate object method "scheme" via package "URI::http"

这应该是 URI模块问题,但如果我在其他脚本中使用 URI 包,它工作正常。

我尝试将 URI 升级到 URI-1.64(从 1.60 升级),在 fedora (x86_64 GNU/Linux) perl 5.16 和 ubuntu (i686 athlon i386 GNU/Linux) perl 5.14 上测试。

例如

 $perl -MURI -E'say $INC{"URI.pm"}; say URI->VERSION; say URI->new("http://www.google.com/")->scheme'
$/home/xxxxx/perl5/lib/perl5/URI.pm
$1.64
$http

知道什么是解决问题的最佳方法吗?

最佳答案

original code使用 Thread::Queue::Any 而不是 Thread::Queue 因为它可以更好地处理对象。但是,原始代码中有两个错误(现已修复)。

use Thread::Queue::Any 1.03 qw( );
...
my $req_q = Thread::Queue->new();
my $res_q = Thread::Queue->new();

应该是

use Thread::Queue::Any 1.03;  # Must call import.
...
my $req_q = Thread::Queue::Any->new();
my $res_q = Thread::Queue::Any->new();

Thread::Queue::Any 在 import 中工作但不应该存在,所以我不调用 import 的习惯做法适得其反。

这些小改动将使代码正常工作。


如果想继续使用 Thread::Queue,看起来您必须在调用 use threads; 之前加载共享对象的模块(我认为这会节省您的内存,所以无论如何都做是个好主意。) URI 动态加载 URI::http,所以你需要添加

use URI::http;

BEGIN { URI->new('', 'http') }

使用线程之前;

这将使您通过该问题(并进入另一个问题)。

关于multithreading - 为什么 URI 对象不能定位方法 "scheme"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26590903/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com