Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > lwp : shared


Автор: Валерия 19.9.2010, 15:37
Почему такое не работает? Разве через shared нельзя расшарить кроме переменной или масива еще и объект?
Код

use LWP::UserAgent;
use threads;
use threads::shared;

my $ua : shared = LWP::UserAgent->new();



my @threads;
for my $i (1..10) {
    push @threads, threads->create(\&mythread, $i);
}
foreach my $thread (@threads) {
    $thread->join();
}


<STDIN>;


sub mythread {
    $content = $ua->get("http://vingrad.ru")->content;
    print $content;
}

Автор: DurRandir 19.9.2010, 15:54
Расшарить - можно. Но не так) Да и очень многие не-pure perl модули с потоками не дружат (ТАК - точно не дружат, если создать новый объект в каждом потоке - могут и заработать).

PS: про "не так": threads::shared exports a version of bless() that works on shared objects such that blessings propagate across threads.
PPS: если задача стоит "получить одновременно несколько страниц", то потоки - неправильный инструмент. Смотрите в сторону AnyEvent::HTTP.

Автор: Валерия 19.9.2010, 23:22
Про "не так" немного не поняла)
Мне именно подобным способом расшарить нужно)

Автор: DurRandir 20.9.2010, 00:54
Мне очень интересно - зачем? Т.е. какую задачу вы этим пытаетесь решить?

Автор: Валерия 20.9.2010, 07:31
1) Нужны общие куки между всеми потоками
2) Однозначно будет меньше расход оперативы, а у меня чахленький сервер, поэтому если я такое проверну, смогу запустить больше потоков

Автор: shamber 20.9.2010, 09:13
Валерия, а общие куки в файлик скинуть и оттуда прочитать разве нельзя?

Автор: Валерия 20.9.2010, 09:24
Цитата(shamber @  20.9.2010,  09:13 Найти цитируемый пост)
Валерия, а общие куки в файлик скинуть и оттуда прочитать разве нельзя? 

Можно конечно, и если бы мне подходило такое решение, то я бы про него и спрашивала (или не спрашивала бы). А топик вообщем-то про общие объекты между потоками, наравне с общими переменными и массивами, и в данном случае просто привела пример с LWP.

Автор: gcc 20.9.2010, 15:59
Валерия, еще есть LWP::Parallel http://search.cpan.org/search?query=LWP%3A%3AParallel&mode=all
там не многопоточнось, а как-то по другому работает...

Автор: DurRandir 20.9.2010, 17:20
Ааа, вы считаете, что, запустив 20 потоков, у вас будет небольшой расход памяти? Вынужден вас разочаровать. Ну и таким способом ничего не выйдет. Далеко не факт, что LWP - потокобезопасный класс (хинт - читайте про thread-safety & reentrant methods, если хотите вызывать методы над общим объектом).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)