На какие модули я должен посмотреть для того, чтобы сделать многопоточность в Perl?

То, чтобы просить, чтобы они записали рекурсивный алгоритм для известного повторяющегося решения (т.е. Fibonacci и т.д. - мы даем им повторяющуюся функцию, в случае необходимости) и затем сделало, чтобы они вычислили время выполнения для нее.

Много раз рекурсивная функция включает древовидную структуру данных. Количество раз человеку не удалось распознать это, экранирует меня. Становится немного трудным вычислить время выполнения, пока Вы не видите, что это - древовидная структура...

я нахожу, что эта проблема покрывает много областей. А именно, их способность чтения кода (если им дают повторяющуюся функцию), пишущая код способность (так как они пишут рекурсивную функцию), алгоритм, структура данных (для времени выполнения)...

7
задан brian d foy 26 September 2009 в 18:49
поделиться

5 ответов

В самых последних версиях Perl есть поддержка потоковой передачи. Запустите perl -V: usethreads , чтобы проверить, доступен ли он в вашей системе.

$ perl -V:usethreads
usethreads='define'

perldoc thread дает довольно хорошее введение в их использование.

7
ответ дан 6 December 2019 в 06:03
поделиться

Если производительность не является большой проблемой, то fork создание нескольких процессов, вероятно, будет намного проще, чем работа с потоками. Я часто использую Parallel :: ForkManager , который очень прост, но очень хорош в том, что он делает.

7
ответ дан 6 December 2019 в 06:03
поделиться

Coro - хороший модуль для совместной работы в многозадачном режиме.

В 99% случаев это то, что вам нужно, если вам нужны потоки в Perl.

Если вы хотите, чтобы потоки ускоряли ваш код, когда доступно несколько ядер, вы идете по неправильному пути. Perl в 50 раз медленнее других языков. Переписывание кода для работы на двух процессорах означает, что теперь он работает только в 25 раз медленнее, чем другие языки ... на одном процессоре. Лучше потратить усилия на перенос медленных частей на другой язык.

Но если вы просто не хотите, чтобы ввод-вывод блокировал другие «потоки», тогда Coro - это именно то, что вам нужно.

2
ответ дан 6 December 2019 в 06:03
поделиться

Существует множество причин, по которым вы можете не захотеть использовать многопоточность. Однако, если вы хотите использовать многопоточность, следующий код может служить полезным примером. Он создает ряд заданий, помещает их в потокобезопасную очередь, затем запускает несколько потоков, которые извлекают задания из очереди и завершают их. Каждый поток продолжает извлекать задания из очереди в цикле, пока не увидит больше заданий. Программа ожидает завершения всего потока и затем выводит общее время, затраченное на выполнение заданий.

#!/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.";
}
9
ответ дан 6 December 2019 в 06:03
поделиться

Похоже, вам не нужна вытесняющая многопоточность; в этом случае посмотрите на кооперативную модель POE . Поскольку ваш код будет уступать место другим потокам, когда вы решите, и у вас будет работать только один поток одновременно, разработка и отладка будут намного проще.

5
ответ дан 6 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: