Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> use Coro, история успеха 
:(
    Опции темы
Pfailed
Дата 14.12.2010, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Недавно обнаружил для себя замечательный модуль Coro.
Привлекло внимание его краткое описание:
Цитата

the only real threads in perl


Обрадовавшись, что кто-то запилил более годные треды для perl принялся изучать документацию.
Но всё оказалось не так просто, как хотелось бы. На самом деле Coro оказался не модулем реализующим создание потоков, в его привычном понимании. Coro -- ни что иное, как продвинутая реализация сопрограмм (coroutine) в Perl, т.е. таких подпрограмм, из которых можно выйти в каком-то её месте, выполнить другую часть программы, а затем вновь вернуться к тому, на чём приостановилось выполнение подпрограммы (этакий goto без тормозов). Помимо этого в Coro есть менеджер созданных сопрограмм, который эффективно переключается между ними в нужные моменты времени, обеспечивая ту саму псевдопараллельность выполения.
Таким образом Coro очень хорошо подходит для работы с сокетами: в то время когда какой-либо из сокетов ожидает прихода данных менеджер сопрограмм переключается на другие сопрограммы и в итоге тормоза одного сокета не останавливают всю программу.
В чём преимущество Coro перед событийно-ориентированными модулями вроде AnyEvent и POE ил простого цикла select? А в том, что если у вас уже есть рабочий код, то вам скорее всего придётся его переписать практически полностью, чтобы воспользоваться этими модулями, но не в случае с Coro.
Простой пример. У меня есть модуль Net::Proxy::Type для определения типа прокси  (который ничего не знает про параллельную обработку нескольких прокси) и несколько тысяч прокси тип которых нужно определить. 

Код

use strict;
use Coro::Select;
use Coro;
use Net::Proxy::Type;

my @proxylist = (...);
my @workers;

for (1 .. $cfg->{workers}) {
    push @workers, async {
        my @list = @_;
        my $pc = Net::Proxy::Type->new();
        foreach my $proxy (@list) {
            my $pt = $pc->get();
            # ...
            # profit
        }
    } splice(@proxylist, 0, $cfg->{proxy_per_worker});
}

$_->join foreach @workers;


При этом потребление памяти очень небольшое, форками и модулем threads такого не добиться, но в тоже время не придётся переписывать рабочий код, как в случае с AnyEvent.
Кстати Coro написал Marc Lehmann, являющийся помимо этого автором AnyEvent и многих других полезных вещей.
За истину не ручаюсь, т.к. только начал с этим знакомиться.


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.