回答
最新版本的Perl具有线程支持。运行perl -V:usethreads
以查看它是否在您的系统中可用。
$ perl -V:usethreads
usethreads='define'
perldoc threads
给出了一个很好的使用它们的介绍。
如果性能是不是一个大问题,然后fork
荷兰国际集团多个进程可能比处理线程容易得多。我经常使用Parallel::ForkManager这非常简单,但非常擅长它。
Coro是合作多任务一个很好的模块。
99%的时间,这是你需要的,如果你想在Perl中的线程。
如果你想线程以加快你的代码时,多个核心可用,你会走上错误的道路。 Perl比其他语言慢了50倍。将代码重写为在两个CPU上运行意味着它现在在一个CPU上的运行速度比其他语言慢25倍。最好花费精力将缓慢的部分移植到不同的语言。
但如果你只是不想IO阻止其他“线程”,然后科罗正是你想要的。
还有发展速度。 – 2009-09-26 21:46:21
我厌倦了这种说法:)我可以像在Perl中一样在Haskell中快速破解许多事情,而Haskell的运行速度比Perl快得多。 – jrockway 2009-09-27 00:55:14
我同意这一点,但声称Perl比其他语言慢了50倍是一种夸大,只适用于某些操作。如您所知,Perl的IO和正则表达式与最好的编译语言一致。如果一个程序员可以识别瓶颈并让开发人员有时间,那么使用Inline :: C可能需要在DSL中编写一些代码。如果他们必须重写DSL中的大部分代码以获得良好的性能加速,那么完全放弃Perl可能是有意义的。 – 2012-10-02 14:24:22
有很多原因可能导致您不想多线程。但是,如果您确实想要多线程,下面的代码可能是一个有用的示例。它创建了一些作业,将它们放入一个线程安全的队列中,然后启动一些从队列中取出作业并完成作业的线程。每个线程在循环中不断从队列中提取作业,直到看不到任何作业。程序等待所有线程完成,然后打印它在工作中花费的总时间。
#!/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.";
}
- 1. 应该执行哪些行为?
- 2. PHP程序员应该注意哪些Java语法差异?
- 3. 开发多线程Javafx应用程序时需要注意哪些事项?
- 4. 哪个线程执行注册动作
- 5. Perl线程安全模块
- 6. 这种模块应该使用哪些OTP行为?
- 7. 多线程执行模式
- 8. startActivity应该在主线程上执行?
- 9. 你应该在游戏中首先执行哪些部分?
- 10. 该脚本应该安装哪些CPAN模块?
- 11. JCA和AES应该注意哪些安全性地雷?
- 12. 我应该注意到FunScript的哪些弱点?
- 13. 细粒度多线程 - 工作任务应该执行多少?
- 14. 我应该使用哪个Perl测试模块?
- 15. 在Rails代码中应该注意哪些类型的并发/死锁问题?
- 16. 哪些vim选项应该在模式行中使用?
- 17. 执行块在哪个线程上运行?
- 18. 我应该在python中使用哪些库进行线性编程?
- 19. 如何确定哪些进程应该在主线程上运行? iOS的
- 20. Perl中的FastCGI应用程序的哪个模块
- 21. 在python的多进程模块中,如何找到哪个工作进程已经执行了该作业
- 22. 我应该在哪些应用程序中对模型执行统计分析的代码?
- 23. 意外的线程执行
- 24. 在进行注册模块时应执行检查类型
- 25. 执行使用的Net :: SSH :: Perl模块,
- 26. 我应该使用哪些模块来创建游戏树?
- 27. 我应该为多页注册表单使用哪些URL模式(使用Django)?
- 28. 在准备甘特图时,我们应该注意哪些事项?
- 29. .Net:CallBack应该在哪个线程上?
- 30. 我应该在Haskell中制作模块应该多少?
切勿使用的ithread什么。 – jrockway 2009-09-26 09:50:53
链接不工作 – 2014-08-04 14:45:22