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


Автор: artem78 2.6.2015, 19:46
Подскажите как можно осуществить, чтобы с одним экземпляром LWP::UserAgent можно было работать из нескольких потоков и чтобы у них была общая переменная с куками? Если делать так, то будет ошибка Invalid value for shared scalar.

Код

my $cookie_jar:shared = new HTTP::Cookies;
my $ua:shared = new LWP::UserAgent;
$ua->agent('Mozilla/5.0 (Windows NT 5.1; rv:34.0) Gecko/20100101 Firefox/34.0');
$ua->timeout(30);
$ua->default_header('Accept' => 'text/html');
$ua->default_header('Accept-Language' => 'ru');
$ua->cookie_jar($cookie_jar);

Автор: Nab 2.6.2015, 22:50
Может лучше стоит использовать методы save($file), load($file) модуля HTTP::Cookies.

Автор: artem78 2.6.2015, 23:34
Записалась в переменную одна кука, вызываю метод save, в файл записывется #LWP-Cookies-1.0 и больше ничего.

Автор: noize 3.6.2015, 23:32
Используйте форки + какой-нибудь IPC::Shareable или redis для хранения кеша(кукисов) между процессами

Автор: Nab 6.6.2015, 11:23
По моему тут надо по другому на задачу взглянуть.

Если кука нужна чтоб сделать кучу  запросов после авторизации, то и делайте авторизацию в начальном потоке, а потом форкайтесь на солько потоков сколько нужно с уже готовой кукой.

Смысл в том, что получение куки для параллельных задач проще сделать в самом начале а потом уже делить на под-задачи.

А вот если задача не делиться, то и шарить куку смысла нет. Когда-то я делал одну вещь с жестким контролем авторизации: там кука менялась с каждым запросом, соответственно задача к примеру автоматизировать запросы к моему сервису могла решаться только последовательно, никаких форков или еще чего.

Так что может опишите задачу более широко.

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