Perl에서 멀티 스레딩을 수행하기 위해 어떤 모듈을 고려해야합니까?Perl에서 멀티 스레딩을 수행하기 위해 어떤 모듈을 고려해야합니까?
상당히 낮은 성능을 기대하고 있습니다. 스레드가 여러 작업자를 동시에 실행하고 각 작업자가 다양한 시간 동안 자고 싶습니다.
Perl에서 멀티 스레딩을 수행하기 위해 어떤 모듈을 고려해야합니까?Perl에서 멀티 스레딩을 수행하기 위해 어떤 모듈을 고려해야합니까?
상당히 낮은 성능을 기대하고 있습니다. 스레드가 여러 작업자를 동시에 실행하고 각 작업자가 다양한 시간 동안 자고 싶습니다.
최근 버전의 Perl은 스레딩을 지원합니다. perl -V:usethreads
을 실행하여 시스템에서 사용할 수 있는지 확인하십시오.
$ perl -V:usethreads
usethreads='define'
perldoc threads
은 사용법을 잘 설명합니다.
성능은 큰 문제가되지 않는 경우, 다음 fork
보내고 여러 프로세스 아마 스레드를 다루는 것보다 훨씬 쉬울 것이다. 나는 자주 사용하는 Parallel::ForkManager을 사용하지만 아주 잘한다.
Coro 협동 멀티 태스킹을위한 좋은 모듈입니다.
시간의 99 %는 Perl에서 스레드를 원한다면 필요한 것입니다.
당신이 스레드가 여러 개의 코어를 사용할 수있는 경우 코드를 빠르게하려면
, 당신은 잘못된 길을 가고있다. Perl은 다른 언어보다 50 배 느립니다. 두 개의 CPU에서 실행되도록 코드를 다시 작성하면 하나의 CPU에서 다른 언어보다 25 배 느리게 실행됩니다. 느린 부분을 다른 언어로 포팅하는 노력을 기울이는 것이 좋습니다. 그냥 다른 "스레드"차단 IO를하지 않으려면는하지만, 다음 코로는 당신이 원하는 것을 정확히이다.
개발 속도도 있습니다. –
나는이 논쟁에 질려가있다 :) 내가 Haskell에서 Perl처럼 빠르게 해킹 할 수있는 많은 것들이 있으며, Haskell은 perl보다 훨씬 빠르게 실행된다. – jrockway
이 부분에 동의하지만 Perl이 다른 언어보다 50 배 느리다는 주장은 특정 작업에만 적용되는 과장입니다. Perl의 IO 및 정규 표현식은 최상의 컴파일 언어와 동등합니다. 프로그래머가 병목 현상을 식별하고 개발자의 시간을 가질 수 있다면 Inline :: C를 사용하여 DSL에 코드를 작성하는 것이 좋습니다. 좋은 성능 향상을 위해 DSL에서 코드의 대부분을 다시 작성해야한다면 Perl을 완전히 삭제하는 것이 좋습니다. –
왜 다중 스레드를 원하지 않는 데에는 많은 이유가 있습니다. 그러나 다중 스레드를 원한다면 다음 코드가 도움이 될 수 있습니다. 많은 작업을 생성하고 스레드 안전 대기열에 넣은 다음 대기열에서 작업을 가져 와서 완료하는 일부 스레드를 시작합니다. 각 스레드는 더 이상 작업이 없을 때까지 루프의 대기열에서 작업을 계속 가져옵니다. 프로그램은 모든 스레드가 완료 될 때까지 대기 한 다음 작업에 소비 한 총 시간을 인쇄합니다.
#!/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.";
}
는 아무것도 ithreads을 사용하지 마십시오. 링크는 주목할 가치가 – jrockway
은 그 POE는 암시 적 멀티 스레딩 또는 멀티,'POE는 :: 휠 :: Run'는 I/O 및 종료 상태를 번역, 당신이 갈래 과정에서 코드 조각을 실행할 수를 지원하지 않는 동안 POE 이벤트. 가끔 블로킹 코드를 감싸는 것이 매우 유용합니다. –