2009-09-26 4 views

답변

7

최근 버전의 Perl은 스레딩을 지원합니다. perl -V:usethreads을 실행하여 시스템에서 사용할 수 있는지 확인하십시오.

$ perl -V:usethreads 
usethreads='define' 

perldoc threads은 사용법을 잘 설명합니다.

+2

는 아무것도 ithreads을 사용하지 마십시오. 링크는 주목할 가치가 – jrockway

+0

은 그 POE는 암시 적 멀티 스레딩 또는 멀티,'POE는 :: 휠 :: Run'는 I/O 및 종료 상태를 번역, 당신이 갈래 과정에서 코드 조각을 실행할 수를 지원하지 않는 동안 POE 이벤트. 가끔 블로킹 코드를 감싸는 것이 매우 유용합니다. –

7

성능은 큰 문제가되지 않는 경우, 다음 fork 보내고 여러 프로세스 아마 스레드를 다루는 것보다 훨씬 쉬울 것이다. 나는 자주 사용하는 Parallel::ForkManager을 사용하지만 아주 잘한다.

5

선점 형 멀티 스레딩이 필요하지 않은 것 같습니다. 이 경우 POE의 협조 모델을보십시오. 결정할 때 코드가 다른 스레드에만 양보되고 한 번에 하나의 스레드 만 실행하므로 개발 및 디버깅이 훨씬 쉬워집니다.

+3

작동하지 않습니다 – hobbs

+0

그 두 번째는 _ – xxxxxxx

2

Coro 협동 멀티 태스킹을위한 좋은 모듈입니다.

시간의 99 %는 Perl에서 스레드를 원한다면 필요한 것입니다.

당신이 스레드가 여러 개의 코어를 사용할 수있는 경우 코드를 빠르게하려면

, 당신은 잘못된 길을 가고있다. Perl은 다른 언어보다 50 배 느립니다. 두 개의 CPU에서 실행되도록 코드를 다시 작성하면 하나의 CPU에서 다른 언어보다 25 배 느리게 실행됩니다. 느린 부분을 다른 언어로 포팅하는 노력을 기울이는 것이 좋습니다. 그냥 다른 "스레드"차단 IO를하지 않으려면

는하지만, 다음 코로는 당신이 원하는 것을 정확히이다.

+1

개발 속도도 있습니다. –

+0

나는이 논쟁에 질려가있다 :) 내가 Haskell에서 Perl처럼 빠르게 해킹 할 수있는 많은 것들이 있으며, Haskell은 perl보다 훨씬 빠르게 실행된다. – jrockway

+0

이 부분에 동의하지만 Perl이 다른 언어보다 50 배 느리다는 주장은 특정 작업에만 적용되는 과장입니다. Perl의 IO 및 정규 표현식은 최상의 컴파일 언어와 동등합니다. 프로그래머가 병목 현상을 식별하고 개발자의 시간을 가질 수 있다면 Inline :: C를 사용하여 DSL에 코드를 작성하는 것이 좋습니다. 좋은 성능 향상을 위해 DSL에서 코드의 대부분을 다시 작성해야한다면 Perl을 완전히 삭제하는 것이 좋습니다. –

9

왜 다중 스레드를 원하지 않는 데에는 많은 이유가 있습니다. 그러나 다중 스레드를 원한다면 다음 코드가 도움이 될 수 있습니다. 많은 작업을 생성하고 스레드 안전 대기열에 넣은 다음 대기열에서 작업을 가져 와서 완료하는 일부 스레드를 시작합니다. 각 스레드는 더 이상 작업이 없을 때까지 루프의 대기열에서 작업을 계속 가져옵니다. 프로그램은 모든 스레드가 완료 될 때까지 대기 한 다음 작업에 소비 한 총 시간을 인쇄합니다.

#!/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."; 
} 
관련 문제