Multithreading 如何在Perl中创建线程?
我有一个简单的Perl脚本,其中有一个大循环,在这个脚本中,我调用了大约一百万次函数Multithreading 如何在Perl中创建线程?,multithreading,perl,Multithreading,Perl,我有一个简单的Perl脚本,其中有一个大循环,在这个脚本中,我调用了大约一百万次函数my_fun()。我想创建一个线程池来处理这个问题——在同一时间内最多有5个线程在循环中调用这个方法 对我来说,使用最快的库是非常重要的——看到示例会非常好 我的代码如下所示: for (my $i = 0; $i < 1000000 ; $i++) { my_fun(); } for(我的$i=0;$i
my_fun()
。我想创建一个线程池来处理这个问题——在同一时间内最多有5个线程在循环中调用这个方法
对我来说,使用最快的库是非常重要的——看到示例会非常好
我的代码如下所示:
for (my $i = 0; $i < 1000000 ; $i++) {
my_fun();
}
for(我的$i=0;$i<1000000;$i++){
我的乐趣;
}
提前感谢您请查看文档。请查看。它使用的是fork
,而不是线程,但它应该可以非常简单地完成您的工作
示例摘自文档,稍作修改:
use Parallel::ForkManager;
my $pm = Parallel::ForkManager->new(5); # number of parallel processes
for my $i (0 .. 999999) {
# Forks and returns the pid for the child:
my $pid = $pm->start and next;
#... do some work with $data in the child process ...
my_fun();
$pm->finish; # Terminates the child process
}
$pm->wait_all_children;
我们不能给你最快的方法,因为这取决于工作,而你没有告诉我们工作是什么 <>但是你确实问过线程,所以我会给你一个线程应用程序的基础。这是一个工人模型。它是健壮的、可维护的和可扩展的
use threads;
use Thread::Queue qw( ); # Version 3.01+ required
my $NUM_WORKERS = 5;
sub worker {
my ($job) = @_;
...
}
my $q = Thread::Queue->new();
my @workers;
for (1..$NUM_WORKERS) {
push @workers, async {
while (defined(my $job = $q->dequeue())) {
worker($job);
}
};
}
$q->enqueue($_) for @jobs; # Send work
$q->end(); # Tell workers they're done.
$_->join() for @workers; # Wait for the workers to finish.
这是一个基本流(单向),但通过添加响应队列很容易实现双向
这使用实际的线程,但您可以通过切换use threads切换到使用进程编码>到使用叉子代码>
也可用于提供工作者模型,但它不断地创建新流程,而不是重用它们。不过,这确实让它能够轻松处理儿童死亡问题
Ref:(或)是的,当然我已经读过了,但我需要最快的方法,所以为什么我问你真的需要线程(如共享内存、并发控制)或仅仅是独立的并行执行?如果后者,考虑并行::FokMealth-POD有一个例子,说明如何一次做5个叉。@ DVK我没有看到你的评论。我不想偷你的主意,对不起。@simbabque-没问题。(1) 我太懒了,根本不想查看详细信息并发表文章;(2) 内容就是CC,我不拥有它:);(3) 不像我从来没有借用一个评论的想法作为答案,尽管像你一样,我总是明确地告诉评论者。总之,+1是一个很好的示例代码如果你想以最快的方式完成你的工作,为什么你要限制使用哪种方式(说它必须使用线程池),为什么你不告诉我们这是什么东西?有这样的Windows解决方案吗?@javaGirl它应该在Windows上工作。我刚刚在Windows上测试了它,它对我很有效。