Search
Write a publication
Pull to refresh

Comments 10

POE и потоки — не всегда взаимозаменяемы. Концепция POE — это однопоточная многозадачность, т.е. одна долгая блокирующая операция будет блокировать все задачи (но есть и POE::Component::Pool::Thread — интерфейс к описанной в посте модели).
У POE как раз с сетевыми приложениями все более-менее нормально. А с базами данных да, все так. Можно еще сказать о POE::Wheel::Run.
Ребята, забейте на POE, это жуткий лаг, он не подходит для хоть сколько-нибудь большого приложения где нужна скорость и стабильность. Посмотрите EV, AnyEvent, Coro. Вот результат benchmark из pod'a Anyevent

 name          watchers bytes create invoke destroy comment
         EV/EV   400000   224   0.47   0.35    0.27 EV native interface
        EV/Any   100000   224   2.88   0.34    0.27 EV + AnyEvent watchers
    CoroEV/Any   100000   224   2.85   0.35    0.28 coroutines + Coro::Signal
      Perl/Any   100000   452   4.13   0.73    0.95 pure perl implementation
   Event/Event    16000   517  32.20  31.80    0.81 Event native interface
     Event/Any    16000   590  35.85  31.55    1.06 Event + AnyEvent watchers
   IOAsync/Any    16000   989  38.10  32.77   11.13 via IO::Async::Loop::IO_Poll
   IOAsync/Any    16000   990  37.59  29.50   10.61 via IO::Async::Loop::Epoll
      Glib/Any    16000  1357 102.33  12.31   51.00 quadratic behaviour
        Tk/Any     2000  1860  27.20  66.31   14.00 SEGV with >> 2000 watchers
     POE/Event     2000  6328 109.99 751.67   14.02 via POE::Loop::Event
    POE/Select     2000  6027  94.54 809.13  579.80 via POE::Loop::Select
Единственное, в представленном бенчмарке нету POE::Loop::Tk

А можно узнать, какую версию perl и Tkx вы используете?
У меня на perl5.10 последний Tkx 1.07 не проходит свой test-suite. А если форсировать инсталяцию, то сегфолтится при подгрузке к скрипту.
Я не переходил на 10ю ветку, сижу на 5.8.8/5.8.9, т.к. там появились утечки, которые в моём случае недопустимы (минимального тестового примера с утечками нет, отловил их в классе, который использует weaken для циклических ссылок, и не течёт на 8й ветке).
Проверить поиграться с кодом сейчас, к сожалению, возможности нет. Поэтому скажите плиз, описанный вами подход избавит UI от подвисаний?
Например, если вставить в thread_worker() вызов sleep(), будут ли доступны остальные элементы UI?
sub thread_worker {
    my $self = threads->self();
    my $tid  = $self->tid();
    
    while( defined( my $job = $queue_job->dequeue() ) ) {
        print STDERR "Worker($tid) has received task from Boss: $job\n";
        
        # выполняем какую-нибудь работу...
        #print STDERR "Worker($tid) has finished the task\n";
	print STDERR "Worker($tid) has sleeped: ", scalar(localtime), "\n";

	sleep 10;
	print STDERR "Worker($tid) has woken up: ", scalar(localtime), "\n";

        # скидываем все в одну коробку ;)
        $queue_box->enqueue( "processed: $job" );
    }

    $queue_box->enqueue( undef );    
}


Задания отсылаются в очередь, элементы доступны.

Boss(1) has received the task from Tk: one
Worker(2) has received task from Boss: one
Worker(2) has sleeped: Thu Jul 30 13:31:48 2009
Boss(1) has received the task from Tk: two
Boss(1) has received the task from Tk: three
Worker(2) has woken up: Thu Jul 30 13:31:58 2009
Worker(2) has received task from Boss: two
Worker(2) has sleeped: Thu Jul 30 13:31:58 2009
Boss(1) has received the task from Tk: four
Worker(2) has woken up: Thu Jul 30 13:32:08 2009
Worker(2) has received task from Boss: three
Worker(2) has sleeped: Thu Jul 30 13:32:08 2009
Worker(2) has woken up: Thu Jul 30 13:32:18 2009
Worker(2) has received task from Boss: four
Worker(2) has sleeped: Thu Jul 30 13:32:18 2009
Worker(2) has woken up: Thu Jul 30 13:32:28 2009

Sign up to leave a comment.

Articles