回答
最新版本的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. startActivity应该在主线程上执行?
- 7. 你应该在游戏中首先执行哪些部分?
- 8. JCA和AES应该注意哪些安全性地雷?
- 9. 细粒度多线程 - 工作任务应该执行多少?
- 10. 我应该使用哪个Perl测试模块?
- 11. 在Rails代码中应该注意哪些类型的并发/死锁问题?
- 12. 哪些vim选项应该在模式行中使用?
- 13. 我应该在python中使用哪些库进行线性编程?
- 14. 在python的多进程模块中,如何找到哪个工作进程已经执行了该作业
- 15. 在进行注册模块时应执行检查类型
- 16. 执行使用的Net :: SSH :: Perl模块,
- 17. 我应该使用哪些模块来创建游戏树?
- 18. 我应该为多页注册表单使用哪些URL模式(使用Django)?
- 19. 在准备甘特图时,我们应该注意哪些事项?
- 20. 我应该在Haskell中制作模块应该多少?
- 21. 我应该如何组织很多Perl模块?
- 22. 单线程应用QT时隙执行哪个线程
- 23. 哪个线程正在调用该行?
- 24. 我应该如何在Java中使用多线程执行外部命令?
- 25. 我应该如何在Perl中维护我的对象模块?
- 26. 净:: SSH :: Perl的模块:执行多个命令
- 27. 执行多线程进程
- 28. isAlive()在java多线程中执行
- 29. 哪些平台模块使应用程序过程独特?
- 30. 在哪些情况下,C#中不会执行finally块?
切勿使用的ithread什么。 – jrockway 2009-09-26 09:50:53
链接不工作 – 2014-08-04 14:45:22