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. Работа с потоками