То, чтобы просить, чтобы они записали рекурсивный алгоритм для известного повторяющегося решения (т.е. Fibonacci и т.д. - мы даем им повторяющуюся функцию, в случае необходимости) и затем сделало, чтобы они вычислили время выполнения для нее.
Много раз рекурсивная функция включает древовидную структуру данных. Количество раз человеку не удалось распознать это, экранирует меня. Становится немного трудным вычислить время выполнения, пока Вы не видите, что это - древовидная структура...
я нахожу, что эта проблема покрывает много областей. А именно, их способность чтения кода (если им дают повторяющуюся функцию), пишущая код способность (так как они пишут рекурсивную функцию), алгоритм, структура данных (для времени выполнения)...
В самых последних версиях Perl есть поддержка потоковой передачи. Запустите perl -V: usethreads
, чтобы проверить, доступен ли он в вашей системе.
$ perl -V:usethreads
usethreads='define'
perldoc thread
дает довольно хорошее введение в их использование.
Если производительность не является большой проблемой, то fork
создание нескольких процессов, вероятно, будет намного проще, чем работа с потоками. Я часто использую Parallel :: ForkManager , который очень прост, но очень хорош в том, что он делает.
Coro - хороший модуль для совместной работы в многозадачном режиме.
В 99% случаев это то, что вам нужно, если вам нужны потоки в Perl.
Если вы хотите, чтобы потоки ускоряли ваш код, когда доступно несколько ядер, вы идете по неправильному пути. Perl в 50 раз медленнее других языков. Переписывание кода для работы на двух процессорах означает, что теперь он работает только в 25 раз медленнее, чем другие языки ... на одном процессоре. Лучше потратить усилия на перенос медленных частей на другой язык.
Но если вы просто не хотите, чтобы ввод-вывод блокировал другие «потоки», тогда Coro - это именно то, что вам нужно.
Существует множество причин, по которым вы можете не захотеть использовать многопоточность. Однако, если вы хотите использовать многопоточность, следующий код может служить полезным примером. Он создает ряд заданий, помещает их в потокобезопасную очередь, затем запускает несколько потоков, которые извлекают задания из очереди и завершают их. Каждый поток продолжает извлекать задания из очереди в цикле, пока не увидит больше заданий. Программа ожидает завершения всего потока и затем выводит общее время, затраченное на выполнение заданий.
#!/usr/bin/perl
use threads;
use Thread::Queue;
use Modern::Perl;
my $queue= Thread::Queue->new;
my $thread_count= 4;
my $job_count= 10;
my $start_time= time;
my $max_job_time= 10;
# Come up with some jobs and put them in a thread-safe queue. Each job
# is a string with an id and a number of seconds to sleep. Jobs consist
# of sleeping for the specified number of seconds.
my @jobs= map {"$_," . (int(rand $max_job_time) + 1)} (1 .. $job_count);
$queue->enqueue(@jobs);
# List the jobs
say "Jobs IDs: ", join(", ", map {(split /,/, $_)[0]} @jobs);
# Start the threads
my @threads= map {threads->create(sub {function($_)})} (1 .. $thread_count);
# Wait for all the threads to complete their work
$_->join for (@threads);
# We're all done
say "All done! Total time: ", time - $start_time;
# Here's what each thread does. Each thread starts, then fetches jobs
# from the job queue until there are no more jobs in the queue. Then,
# the thread exists.
sub function {
my $thread_id= shift;
my ($job, $job_id, $seconds);
while($job= $queue->dequeue_nb) {
($job_id, $seconds)= split /,/, $job;
say "Thread $thread_id starting on job $job_id ",
"(job will take $seconds seconds).";
sleep $seconds;
say "Thread $thread_id done with job $job_id.";
}
say "No more jobs for thread $thread_id; thread exiting.";
}
Похоже, вам не нужна вытесняющая многопоточность; в этом случае посмотрите на кооперативную модель POE . Поскольку ваш код будет уступать место другим потокам, когда вы решите, и у вас будет работать только один поток одновременно, разработка и отладка будут намного проще.