Comments 10
POE и потоки — не всегда взаимозаменяемы. Концепция POE — это однопоточная многозадачность, т.е. одна долгая блокирующая операция будет блокировать все задачи (но есть и POE::Component::Pool::Thread — интерфейс к описанной в посте модели).
Ребята, забейте на 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
А можно узнать, какую версию perl и Tkx вы используете?
У меня на perl5.10 последний Tkx 1.07 не проходит свой test-suite. А если форсировать инсталяцию, то сегфолтится при подгрузке к скрипту.
У меня на perl5.10 последний Tkx 1.07 не проходит свой test-suite. А если форсировать инсталяцию, то сегфолтится при подгрузке к скрипту.
Проверить поиграться с кодом сейчас, к сожалению, возможности нет. Поэтому скажите плиз, описанный вами подход избавит UI от подвисаний?
Например, если вставить в thread_worker() вызов sleep(), будут ли доступны остальные элементы 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.
Perl и GUI. Работа с потоками